{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "96f5503b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "115\n"
     ]
    },
    {
     "data": {
      "image/png": "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ly5d0rZt2750fKRrNypfWkpJSVFUVFSv4mtubu5V3vijlStX6tVXX9WxY8c0fvx4Z7/P55Mk1rIPtbW1am5uVm5urqKjoxUdHa3q6mr90z/9k6Kjo531Ye16S0tL0+233x6271vf+pY++OADSfx3dyV/93d/p3Xr1unBBx9UTk6OHn74Yf3t3/6tysvLJbF2kbiatfL5fOrq6lJLS0u/Y0az7u5uLViwQA0NDaqqqnKuxkiDt3ajMmRiY2OVm5urqqqqsP1VVVXKz88fplldn4wxWrFihfbt26ejR48qMzMz7HhmZqZ8Pl/YWnZ1dam6unrUr+XMmTNVX1+vuro6Z8vLy9Pf/M3fqK6uTrfeeitr14/vfve7vT7m/5vf/EYZGRmS+O/uSj799FPdcEP4/9qjoqKcj1+zdlfvatYqNzdXMTExYWOampp0+vTpUb+en0fM2bNndeTIESUnJ4cdH7S1i+BNySPK5x+/fuGFF8y7775riouLTXx8vDl37txwT+268thjjxmPx2OOHz9umpqanO3TTz91xmzcuNF4PB6zb98+U19fbx566KFR+1HOL/Onn1oyhrXrzxtvvGGio6PN008/bc6ePWteeuklM2bMGLN7925nDGvXt8WLF5uvfe1rzsev9+3bZ1JSUsyaNWucMazdF9rb283bb79t3n77bSPJbN682bz99tvOJ2uuZq2WLVtmxo8fb44cOWLeeustM2PGjFHx8esrrV13d7eZN2+eGT9+vKmrqwt7/giFQs45BmPtRm3IGGPMP//zP5uMjAwTGxtrvvOd7zgfKcYXJPW5bd++3Rlz6dIl89RTTxmfz2fcbreZMmWKqa+vH75JX8cuDxnWrn+vvfaayc7ONm6329x2223m5z//edhx1q5vbW1t5oknnjATJkwwN954o7n11lvNk08+Gfbkwdp94dixY33+P27x4sXGmKtbq87OTrNixQqTlJRk4uLizNy5c80HH3wwDI/mq3WltWtoaOj3+ePYsWPOOQZj7VzGGBPp5SIAAIDrwah8jwwAABgZCBkAAGAtQgYAAFiLkAEAANYiZAAAgLUIGQAAYC1CBgAAWIuQAQAA1iJkAACAtQgZAABgLUIGAABY6/8B1JIdsWQBRRgAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import os\n",
    "import sys\n",
    "\n",
    "# 导入前面实现的小王子数据集\n",
    "sys.path.append('./code')\n",
    "from my_utils import TheLittlePrinceDataset\n",
    "\n",
    "dataset = TheLittlePrinceDataset()\n",
    "\n",
    "# 统计每句话的长度\n",
    "sent_lens = []\n",
    "max_len = -1\n",
    "for sentence in dataset.tokens:\n",
    "    sent_len = len(sentence)\n",
    "    sent_lens.append(sent_len)\n",
    "    if sent_len > max_len:\n",
    "        max_len = sent_len\n",
    "        longest = sentence\n",
    "print(max_len)\n",
    "\n",
    "# 简单看一下语料中序列长度的分布\n",
    "import matplotlib.pyplot as plt\n",
    "plt.hist(sent_lens, bins=20)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "aef9f90d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1089 115\n",
      "(1088, 40)\n",
      "[  4  16  19 733 734 735 733 734 735   2  63  20   9   1   1   2   1  10\n",
      " 736 737   4  16  19  21   1   2  30 371 209  33 294   3   0   0   0   0\n",
      "   0   0   0   0]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "dataset.build_vocab()\n",
    "sent_tokens = dataset.convert_tokens_to_ids()\n",
    "# 截断和填充\n",
    "max_len=40\n",
    "for i, tokens in enumerate(sent_tokens):\n",
    "    tokens = tokens[:max_len]\n",
    "    tokens += [dataset.token2id['<pad>']] * (max_len - len(tokens))\n",
    "    sent_tokens[i] = tokens\n",
    "sent_tokens = np.array(sent_tokens)\n",
    "\n",
    "print(len(dataset.tokens), max([len(x) for x in dataset.tokens]))\n",
    "print(sent_tokens.shape)\n",
    "print(sent_tokens[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "74626e87",
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "部分代码参考了GitHub项目d2l-ai/d2l-zh的思路\n",
    "（Copyright (c) 2022 Aston Zhang, Zachary C. Lipton,\n",
    "Mu Li, and Alexander J. Smola, Apache-2.0 License（见附录））\n",
    "\"\"\"\n",
    "import torch\n",
    "from torch import nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "# 定义一个正态分布的函数用于初始化参数\n",
    "def normal(shape):\n",
    "    return torch.randn(size=shape) * 0.01\n",
    "\n",
    "class RNN(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size):\n",
    "        super(RNN, self).__init__()\n",
    "        self.input_size = input_size\n",
    "        self.hidden_size = hidden_size\n",
    "        # 将输入与隐状态分别经过线性变化后相加\n",
    "        self.W_xh = nn.Parameter(normal((input_size, hidden_size)))\n",
    "        self.W_hh = nn.Parameter(normal((hidden_size, hidden_size)))\n",
    "        self.b_h = nn.Parameter(torch.zeros(hidden_size))\n",
    "    \n",
    "    def init_rnn_state(self, batch_size, hidden_size):\n",
    "        return (torch.zeros((batch_size, hidden_size), dtype=torch.float),)\n",
    "    \n",
    "    def forward(self, inputs, states):\n",
    "        seq_len, batch_size, _ = inputs.shape\n",
    "        hidden_state, = states\n",
    "        hiddens = []\n",
    "        for step in range(seq_len):\n",
    "            # 输入hidden_state与inputs经过线性变换后相加，\n",
    "            # 输出的hidden_state也是下一时刻输入的hidden_state\n",
    "            xh = torch.mm(inputs[step], self.W_xh)\n",
    "            hh = torch.mm(hidden_state, self.W_hh)\n",
    "            hidden_state = xh + hh + self.b_h\n",
    "            hidden_state = torch.tanh(hidden_state)\n",
    "            hiddens.append(hidden_state)\n",
    "        # 返回所有时刻的hidden_state: seq_len * batch_size * hidden_size\n",
    "        # 以及最后时刻的hidden_state（可能用于后续输入）: \n",
    "        # batch_size * hidden_size\n",
    "        return torch.stack(hiddens, dim=0), (hidden_state,)\n",
    "\n",
    "# 在循环神经网络的基础上添加语言模型的输入输出、损失计算等\n",
    "class RNNLM(nn.Module):\n",
    "    def __init__(self, model, vocab_size, hidden_size):\n",
    "        super(RNNLM, self).__init__()\n",
    "        self.vocab_size = vocab_size\n",
    "        self.hidden_size = hidden_size\n",
    "        self.embedding = nn.Embedding(vocab_size, hidden_size)\n",
    "        self.model = model\n",
    "        self.W_hq = nn.Parameter(normal((hidden_size, vocab_size)))\n",
    "        self.b_q = nn.Parameter(torch.zeros(vocab_size))\n",
    "        \n",
    "    def forward(self, input_ids):\n",
    "        batch_size, seq_len = input_ids.shape\n",
    "        # input_ids形状为batch_size * seq_len，翻转为seq_len * batch_size，\n",
    "        # 将seq_len放在第一维方便计算\n",
    "        input_ids = torch.permute(input_ids, (1, 0))\n",
    "        # seq_len * batch_size * embed_size\n",
    "        embed = self.embedding(input_ids)\n",
    "        # batch_size * hidden_size\n",
    "        states = self.model.init_rnn_state(batch_size, self.hidden_size)\n",
    "        hiddens, _ = self.model(embed, states)\n",
    "    \n",
    "        hiddens = torch.flatten(hiddens[:-1], start_dim=0, end_dim=1)\n",
    "        output_states = torch.mm(hiddens, self.W_hq) + self.b_q\n",
    "        labels = torch.flatten(input_ids[1:], start_dim=0, end_dim=1)\n",
    "        loss_fct = nn.CrossEntropyLoss(ignore_index=0)\n",
    "        loss = loss_fct(output_states, labels)\n",
    "        return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "25519618",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1088, 40)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "epoch-199, loss=0.4602: 100%|█| 200/200 [02:41<00:00,  1.24i\n"
     ]
    },
    {
     "data": {
      "image/png": "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Y+XKlUZeXp7ro6amxjAMw6isrDQefPBBY/369UZWVpaxYsUKY8qUKUafPn2MiooKN1ffNg8++KCxcuVKIzMz09iwYYMxd+5cIyQkxHW/nn76aSMsLMz46KOPjJ07dxo33nijkZCQ0G2uz8lqtRopKSnGI4880uzx7noPKysrjfT0dCM9Pd0AjOeee85IT093rXppy3276667jKSkJGP58uXG1q1bjQsvvNAYPXq00djY6K7LcjnT9TU0NBhXXHGFkZSUZGzbtq3Z76bFYjEMwzAOHjxo/Pa3vzU2b95sZGVlGZ9//rkxZMgQY+zYsR5xfYZx5mts67/L7noPncrLy43AwEDj1VdfPeX13eEetvY3wjA843dRQaUFL7/8spGammr4+fkZ48aNa7actzsBWvx4++23DcMwjJqaGmP27NlGTEyM4evra6SkpBi33XabkZ2d7d7Cz8L1119vJCQkGL6+vkZiYqJx9dVXG7t373Y9b7PZjMcff9yIj483zGazMWPGDGPnzp1urLh9li5dagDGvn37mj3eXe/hihUrWvy3edtttxmG0bb7Vltba9xzzz1GZGSkERAQYMydO9djrvtM15eVlXXa380VK1YYhmEY2dnZxowZM4zIyEjDz8/PGDBggHHfffcZJSUl7r2wJs50jW39d9ld76HTa6+9ZgQEBBhlZWWnvL473MPW/kYYhmf8LpocxYqIiIh4HM1REREREY+loCIiIiIeS0FFREREPJaCioiIiHgsBRURERHxWAoqIiIi4rEUVERERMRjKaiIiIiIx1JQEZE26du3L88//3yb269cuRKTyURZWVmn1eRJzvbnIyJt4+PuAkSkc8ycOZMxY8Z02B/PzZs3ExQU1Ob2U6dOJS8vj7CwsA75/iLSOymoiPRihmFgtVrx8Wn9PwUxMTFn9d5+fn6uY+JFRNpLQz8iPdDtt9/OqlWreOGFFzCZTJhMJg4fPuwajlm6dCkTJkzAbDazZs0aDh06xJVXXklcXBzBwcFMnDiR5cuXN3vPk4c2TCYTf/3rX/nud79LYGAgAwcOZPHixa7nTx76eeeddwgPD2fp0qUMHTqU4OBgLr30UvLy8lyvaWxs5L777iM8PJyoqCgeeeQRbrvtNq666qozXu/69euZMWMGAQEBJCcnc99991FdXd2s9ieffJKbbrqJ4OBgEhMT+fOf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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 梯度裁剪\n",
    "def grad_clipping(model, theta=1):\n",
    "    params = [p for p in model.parameters() if p.requires_grad]\n",
    "    norm = torch.sqrt(sum(torch.sum((p.grad ** 2)) for p in params))\n",
    "    if norm > theta:\n",
    "        for param in params:\n",
    "            param.grad[:] *= theta / norm\n",
    "    \n",
    "\n",
    "# 训练\n",
    "from torch.utils.data import DataLoader\n",
    "from torch.optim import SGD, Adam\n",
    "import numpy as np\n",
    "from tqdm import tqdm, trange\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def train_rnn_lm(data_loader, rnn, vocab_size, hidden_size=128, \n",
    "                 epochs=200, learning_rate=1e-3):\n",
    "    # 准备模型、优化器等\n",
    "    rnn_lm = RNNLM(rnn, vocab_size, hidden_size)\n",
    "    optimizer = Adam(rnn_lm.parameters(), lr=learning_rate)\n",
    "    rnn_lm.zero_grad()\n",
    "    rnn_lm.train()\n",
    "\n",
    "    epoch_loss = []\n",
    "    with trange(epochs, desc='epoch', ncols=60) as pbar:\n",
    "        for epoch in pbar:\n",
    "            for step, batch in enumerate(data_loader):\n",
    "                loss = rnn_lm(batch)\n",
    "                pbar.set_description(f'epoch-{epoch}, ' + \\\n",
    "                    f'loss={loss.item():.4f}')\n",
    "                loss.backward()\n",
    "                grad_clipping(rnn_lm)\n",
    "                optimizer.step()\n",
    "                rnn_lm.zero_grad()\n",
    "            epoch_loss.append(loss.item())\n",
    "\n",
    "    epoch_loss = np.array(epoch_loss)\n",
    "    # 打印损失曲线\n",
    "    plt.plot(range(len(epoch_loss)), epoch_loss)\n",
    "    plt.xlabel('training epoch')\n",
    "    plt.ylabel('loss')\n",
    "    plt.show()\n",
    "\n",
    "sent_tokens = np.array(sent_tokens)\n",
    "print(sent_tokens.shape)\n",
    "vocab_size = len(dataset.token2id)\n",
    "\n",
    "data_loader = DataLoader(torch.tensor(sent_tokens, dtype=torch.long),\\\n",
    "    batch_size=16, shuffle=True)\n",
    "rnn = RNN(128, 128)\n",
    "train_rnn_lm(data_loader, rnn, vocab_size, hidden_size=128,\\\n",
    "    epochs=200, learning_rate=1e-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "0f957e65",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "epoch-199, loss=0.3733: 100%|█| 200/200 [07:18<00:00,  2.19s\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAGwCAYAAACHJU4LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABdn0lEQVR4nO3dd3hb1f0G8PdKsiRblrz3jp09nE0cQhICJCSMsFcKoWzK3k0pBUrbUPYI5QeUDSW0EAJtICGBTEKmnb2ceO9tecqydH9/XOlairdja9jv53n81Lq6ks7NteuXc77nHEEURRFEREREHkjh7gYQERERdYZBhYiIiDwWgwoRERF5LAYVIiIi8lgMKkREROSxGFSIiIjIYzGoEBERkcdSubsBZ8JqtaKoqAh6vR6CILi7OURERNQDoiiirq4O0dHRUCi67jPx6qBSVFSEuLg4dzeDiIiI+iA/Px+xsbFdnuPVQUWv1wOQLtRgMLi5NURERNQTRqMRcXFx8t/xrnh1ULEP9xgMBgYVIiIiL9OTsg0W0xIREZHHYlAhIiIij8WgQkRERB6LQYWIiIg8FoMKEREReSwGFSIiIvJYDCpERETksRhUiIiIyGMxqBAREZHHYlAhIiIij8WgQkRERB6LQYWIiIg8FoNKB0RRxJYT5bBaRXc3hYiIaEhjUOnAr6cqcdMHu3D+K5uxclceTK0WdzeJiIhoSGJQ6UCJsRkGrQpZFQ34/aqDuPLt7RBF9q4QERG5GoNKB66YHIvty87Dk4tGAwAOFRrR0MJeFSIiIldjUOmEv0aF22cPg59aCQCorDe5uUVERERDD4NKN0L81QCAivoWN7eEiIho6GFQ6UaITgOAPSpERETuwKDSjVBbj0plA3tUiIiIXI1BpRvsUSEiInIfBpVusEaFiIjIfRhUuhHib+tR4dAPERGRyzGodMNeo1JRx6EfIiIiV2NQ6YZco9LAoEJERORqDCrdsNeoVLJGhYiIyOUYVLphDypVjS2wcDdlIiIil2JQ6UawnxqCAIgiUN3IXhUiIiJXYlDphkqpQJAfh3+IiIjcgUGlB0J09qDCgloiIiJXYlDpAXnRN66lQkRE5FIMKj0gL/rGHhUiIiKXYlDpgVAda1SIiIjcgUGlB9qW0WePChERkSsxqPQANyYkIiJyDwaVHpCX0WeNChERkUsxqPSAfWNC7qBMRETkWm4NKs888wwEQXD6ioyMdGeTOtQ264dBhYiIyJVU7m7A2LFjsWHDBvmxUql0Y2s6Zq9RqTe1otlsgdbH89pIREQ0GLk9qKhUqh73ophMJphMbXUiRqNxoJrlRK9RQa1UoMViRWVDC2ICfV3yuUREREOd22tUMjMzER0djaSkJFx33XXIysrq9Nzly5cjICBA/oqLi3NJGwVBaJv5U8eCWiIiIldxa1A566yz8Mknn2DdunV47733UFJSgpkzZ6KysrLD85ctW4ba2lr5Kz8/32VtDddLdSolxmaXfSYREdFQ59ahn4ULF8rfjx8/HmlpaUhOTsbHH3+Mhx9+uN35Go0GGo3GlU2UxYfosL+gFrmVDW75fCIioqHI7UM/jnQ6HcaPH4/MzEx3N6WdxBA/AEBOZaObW0JERDR0eFRQMZlMOHr0KKKiotzdlHYSQnQAwB4VIiIiF3JrUHn00UexefNmZGdnY+fOnbjqqqtgNBqxdOlSdzarQ0mhth6VCvaoEBERuYpba1QKCgpw/fXXo6KiAmFhYZgxYwZ27NiBhIQEdzarQ/YelaLaJq6lQkRE5CJuDSorV65058f3SohODX+NCvWmVhRUNyIlXO/uJhEREQ16HlWj4skEQUCibfgnm8M/RERELsGg0gssqCUiInItBpVeSLIFlewKBhUiIiJXYFDphQTbWiq5XEuFiIjIJRhUeiExVOpRyeHQDxERkUswqPRCon2Kck0TTK0WN7eGiIho8GNQ6YVQfzV0aiWsIpBf1eTu5hAREQ16DCq9IAgCZ/4QERG5EINKLyXZ6lS+21+EktpmN7eGiIhocGNQ6aVxMQEAgG/3FWHm8z/hrY0n3dwiIiKiwYtBpZfumD0ML1+diikJQbCKwL925rm7SURERIMWg0ovKRUCrpwSi3dunAKgbZNCIiIi6n8MKn0UolPDoFVBFLlSLRER0UBhUOkjQRAwLMwfAJBVzqBCREQ0EBhUzsCwMGkGUFZ5vZtbQkRENDgxqJyBZHuPCod+iIiIBgSDyhkYFsoeFSIiooHEoHIGHGtURFF0c2uIiIgGHwaVM5AQ4gdBAOpMrSivN7m7OURERIMOg8oZ0PooERvkC4Azf4iIiAYCg8oZGhbKKcpEREQDhUHlDHGKMhER0cBhUDlDwzhFmYiIaMAwqJyhZE5RJiIiGjAMKmfI3qOSX83NCYmIiPobg8oZijBoEKbXwGIVsTe32t3NISIiGlQYVM6QIAiYOyIMALDxWJmbW0NERDS4MKj0g3NHhQMANh5nUCEiIupPDCr9YNbwUCgVAk6VNyCvstHdzSEiIho0GFT6gUHrg6kJQQCATSfYq0JERNRfGFT6iTz8wzoVIiKifsOg0k/OHSkFle2nKjlNmYiIqJ8wqPSTERH+iA7QwtRqxY6sSnc3h4iIaFBgUOkngiBgZkooAGBPDtdTISIi6g8MKv1ocrxUUJuex6BCRETUHxhU+tHkhEAAwL78GrRarO5tDBER0SDAoNKPhofrodeo0NhiwfHSOnc3h4iIyOsxqPQjpULAxPhAAEA69/0hIiI6Ywwq/aytTqXGvQ0hIiIaBBhU+tnkBBbUEhER9RcGlX42MS4QAJBb2YiKepN7G0NEROTlGFT6WYCvD0ZE+ANgnQoREdGZYlAZAPY6lY3Hue8PERHRmWBQGQAXTYgCAHyxKx+/nKxwc2uIiIi8F4PKADhneBiunx4PAHjk3/tR09ji5hYRERF5JwaVAfLUxaMxLFSHEmMz/vy/I+5uDhERkVdiUBkgfmoVnrtsHABgywkO/xAREfUFg8oASgmXZv9UN7bAahXd3BoiIiLvw6AygIL81AAAi1VEbZPZ6bncygYsfH0r1hwodkfTiIiIvAKDygBSqxQwaFUAgMoG58Xf/negGEeLjXjz50x3NI2IiMgrMKgMsFB/DQCgst555k9RTRMA4FhJHQpt39tVN7Tgm4wCNJstrmkkERGRh2JQGWAh/tLwT2WDc1BxDCc/H3NeGO71nzLx0Jf7sXJX3sA3kIiIyIMxqAywEJ29R8V56KfIIahsPC2o5FY2AAAOFNQOcOuIiIg8G4PKALP3qFQ4DP2IoojC6rag8svJCjS1tA3z2M89VlLnolYSERF5JgaVARZir1FxKKY1NreiwRZMwvUamFqt+DWrba0Ve+/LyfJ6tFqsLmwtERGRZ/GYoLJ8+XIIgoAHH3zQ3U3pV6H2GhWHHhV7b0qwTo35YyMAtNWpiKIo96i0tFqRU9noyuYSERF5FI8IKrt378a7776LCRMmuLsp/a6tRqUtqNjrU6IDtZg3KhwAsOl4OQCpt6XFoRflOId/iIhoCHN7UKmvr8eSJUvw3nvvISgoqMtzTSYTjEaj05ena5v10zb0U1QrBZWYQF9MiA0EIM0Camm1tiu6PV7i+ddIREQ0UNweVO655x5cdNFFOP/887s9d/ny5QgICJC/4uLiXNDCMxOiaz89uVDuUfFFsJ8aaqUCogiUGpudim4BFtQSEdHQ5tagsnLlSqSnp2P58uU9On/ZsmWora2Vv/Lz8we4hWfOXkxb02iG2TakY69RiQn0hUIhIDJACwAoMTbLPSoqhQAAOFHKoEJEREOX24JKfn4+HnjgAXz22WfQarU9eo1Go4HBYHD68nSBvj6wZQ5U23pVihx6VADIQaW4thkVtqAyMS4QAJBb1YjGllYXtpiIiMhzuC2o7N27F2VlZZgyZQpUKhVUKhU2b96MN954AyqVChbL4Fg+XqEQEGwrqLUP6xTVNAOQelQAINoeVGqa5HNGROoR6q+GKAKZpfWubjYREZFHULnrg8877zwcPHjQ6dhvf/tbjBo1Ck888QSUSqWbWtb/Qv3VqKg3obLBBLPFitI6Kai09ahI/1tc2ywPD4X6azAyUo+Kk5U4XlqHVFsPCxER0VDitqCi1+sxbtw4p2M6nQ4hISHtjnu7EIe1VEpqmyGK0s7K9kLbKHuNSm2z/JpQfzVGROjxy8lKTlEmIqIhy21BZSgJkYd+TG0zfgK0UNiKV6LkGpUm+Cil0bhQfw3Utu9PlnHoh4iIhiaPCiqbNm1ydxMGhL1HpaqhRS6kjQnylZ+Pchj60WmkWxLqr4GfWhr+KqtzXluFiIhoqPCooDJYhfq3rU7rp7b3qLQFFfusn/J6E+pN0gyfEH81/FqkoFLOoEJEREMUg4oLBOvaVqdV2OZZ2QtpAWlROLVSgRaLFY22zQpD/TVoNkvfVzWYYLGKUNrnORMREQ0Rbl+ZdiiwF80WVDdh4zFpT59hYTr5eYVCQESARn6sVipg0KrkgGMVgepGadryS+uO49yXNslrshAREQ1mDCouYF+d9lhJHUqMzYgJ9MWF4yKdzokyOPSw+KshCAJ8lAoE+fkAgLwQ3DcZhciuaMC+/BrXNJ6IiMiNGFRcINRWTGv3wPnDoVE5rxMTFah1OF/T7vuKuhZYrCJKjdIUZmOzeaCaS0RE5DEYVFwgxCF4JIfpcMWkmHbn2AtqpfPbgo0cVOpNqKw3odUqAgCMTQwqREQ0+DGouIBOrYS/bdrxI/NHQqVs/88eZeikR0XfFlSKHRaEMzZz/x8iIhr8OOvHBQRBwAtXTUBhdRMWnlabYhflMAvIeehH6l0pPy2o1LJHhYiIhgAGFRdZND6qy+ejAhx7VDoY+qlrQUltk3ycQz9ERDQUcOjHQ0QFdNyjEuZQo1JsdBz6YVAhIqLBj0HFQ4To1PBRSgu6ORbThjnUqDhuWmhsYo0KERENfgwqHkKhEDAq0gCFAAwL85ePO876cS6mZY8KERENfqxR8SAf3DwNFfUmxDgW1upty+/Xt8g7KwOsUSEioqGBQcWDhOk18lCPXYhOetxqFVFQ3VZMy1k/REQ0FHDox8OpVQoE+Pq0O25sboUoSou/NZst8vdERESDCYOKF3Ccrqy3LRxnsYpobLEgt7IBE//8I55cfchdzSMiIhowDCpewHG6cmKoTp4dZGw2IyOvBs1mKzYeK3NX84iIiAYMg4oXCHWoW4kK0MKglYaCjE2tKKuTZgIV1zajsYVTlomIaHBhUPECYf6nBRVbzUptkxllRpP8XE5Fo8vbRkRENJAYVLyAY41KZICvHFSMTWaU1rUFleyKBpe3jYiIaCAxqHiB0NN7VLRSQa2x2Ywyh2X1syvqXd42IiKigcSg4gUcg0qkw9CPscmMcocelSz2qBAR0SDDoOIFOi2mbW5FqVOPCoMKERENLgwqXsBxtdoIgxYGX2nop7i2CQ0tFvk5BhUiIhpsuIS+F4gO0GJpWgKCdGpofZTySrUny6SaFI1KAVOrFTWNZlQ3tCBIp+7q7YiIiLwGg4oXEAQBzy4eJz+2D/1k2oJKdKAvms0WFNc2I6uiAVN6EFREUUS9qRV6bfvl+YmIiDwFh368kL2YtqZR2pgwXK/BsDAdgJ4P//x97XFM/PN67M2tGphGEhER9QMGFS9kn55sF27QIinUHlR6NkX5fweKYLGKOFhQ2+/tIyIi6i8c+vFChtN2Uw7XaxAd6AugZz0qxbVNKKhuAiDNHCIiIvJU7FHxQgZt+6AyzNajklXefVDZnVMtf1/bZO7fxhEREfUjBhUvFHBaj0qEw9BPTmUDrFaxy9fvzm6rSzEyqBARkQdjUPFC+tNrVPQaxAb5Qq9VodlsxdaTFV2+fndOW1BhjwoREXkyBhUvpPVRQqNqu3XhBg1USgWunBwLAPj015xOX1vbZMbx0jr5sbGZQYWIiDwXg4qXciyoDTdoAQA3piUAAH46Vob8qsYOX5eeWw3RYWSotonFtERE5LkYVLyUfYqy1kcBvUb6PjnMH7NSQiGKwGc7c7EqvQDXvPMrPt+ZC9GWTnbZhn1GRPgDYI0KERF5Nk5P9lL2gtpwvRaCIMjHb0xLwLaTFXhnc5Z8bFd2FdYcKMbC8VFYd6gEADBvVAROlNYzqBARkUdjj4qXMshBReN0/LxR4YgOkIaCtD4KXDM1FlofBbafqsRTqw8hy7bOygVjIgAAdaZWWLqZJUREROQu7FHxUva1VCJs9Sl2KqUCK5ZMxvojpbhhejzigv3wu7kpeP2nTNSbWhFh0GBaYjDGxwTIr6lrNiPQjxsZEhGR52FQ8VIGX+nWhZ3WowIAk+ODMDk+SH6cGKrDq9dObHeer48STWYLjE2tDCpEROSROPTjpRaNj8LICD0unhDV5/ew17l0tpbKtswK3PDeDmSV92z/ICIiov7GoOKlZiaHYt1DszE1MbjP72HvlelsLZX3t2Vh+6lKfLe/qN1zL6w9hnkvb0J1Q0ufP5+IiKg7DCpDmL1HpbOZP4eLjAAgb2Do6Nt9Rcgqb8CvWZUD10AiIhryGFSGMHtBbm2TGaZWC5b8cwee/e9hAEB5nQlldSYAaLd4nCiKqKiXnjtVxmEhIiIaOAwqQ5h9irOx2YxDhUb8crISH23PQW2TGYeLauXzTu9RaWixwNRqBQCcYv0KERENIAaVIcyxmLaoRgojoigtEHek2CifV1zbBLPFKj+utPWmAMCp8gYXtZaIiIYiBpUhzL4Mv7GpFYU1bb0mO7Iq5foUALCKQHFNs/y4or6tgPZUeb28PD8REVF/4zoqQ5jBoUfFYRV+7MiqRGOLxencgupGxIf4AXDuUWlssaDE2IyoAN+BbzAREQ057FEZwhxrVIocelSOFBuRUykN6dhXsM2vbiuodexRAYBTZRz+ISKigcGgMoQ51qg4FsyKovQVadBiQqwUVByfd+xRAVhQS0REA4dBZQizT082OhTTTk9qW0BubLQBccHScI/jFOVK2yJv9uEiBhUiIhooDCpDmH1l2uLaZhibWwEAV06OkZ8fE21AbJBUe5Lv0KNiX0NldKQBAIMKERENHAaVIcw+9GMvnA3w9cG8URHy82OjDYgLknpUChxqVCptNSr23hfWqBAR0UBhUBnC7MW0djGBvgjTa3DO8FAE+flgWmKwPPRTajSh2SwFmsoGqUfFHlRKjM2oN7W6sOVERDRUcHryEOavVkEhSOukAEB0oDTM8/7SabCKIrQ+SoiiCD+1Eo0tFhTVNGFYmL/co5IUqkOYXoPyOhNOldUjNS7QTVdCRESDFXtUhjCFQoBe29arYq9HUasU0PooAQCCIMjDP/nVTbBYRVQ1SkElxF+N5DAdANapEBHRwHBrUHn77bcxYcIEGAwGGAwGpKWl4YcffnBnk4acAIfhn+hAbYfnyAW1VY2obmyBfSHaYD81ksP8AQCZ3JyQiIgGgFuDSmxsLJ5//nns2bMHe/bswbx587B48WIcPnzYnc0aUuwzfwAgJtCvw3PsdSoF1U3ysE+Qnw9USgVGRUkzf4467A1ERETUX9xao3LJJZc4Pf7rX/+Kt99+Gzt27MDYsWPbnW8ymWAytS02ZjTyj+OZMmh716NiX+wtxF8DABhjCypHingviIio/3lMjYrFYsHKlSvR0NCAtLS0Ds9Zvnw5AgIC5K+4uDgXt3LwcRz6iQnseL+e4RF6AMDBwlpU2BZ7C/VXAwBGReohCEBZnQnldaYOX09ERNRXfQoqH3/8MdasWSM/fvzxxxEYGIiZM2ciNze3V+918OBB+Pv7Q6PR4K677sI333yDMWPGdHjusmXLUFtbK3/l5+f3pfnkwN6jolYqEGrrJTndlIQgKAQgr6oRhwtrAbT1qOg0KiSFSAW1HP4hIqL+1qeg8re//Q2+vtJ/ff/6669YsWIFXnjhBYSGhuKhhx7q1XuNHDkS+/btw44dO3D33Xdj6dKlOHLkSIfnajQaufDW/kVnJsBPCipRgVooFEKH5/hrVBhn25zwh0MlAIBQnVp+fnS0bfiHQYWIiPpZn4JKfn4+UlJSAACrV6/GVVddhTvuuAPLly/H1q1be/VearUaKSkpmDp1KpYvX47U1FS8/vrrfWkW9YFBK5UpdTbsYzc9UVrcLc+250+IQ+8L61SIiGig9Cmo+Pv7o7KyEgDw448/4vzzzwcAaLVaNDU1dfXSbomi6FQwSwNrtC1kTOxmsTbHzQoBaQ0VuzF96FEpq2t22uiQiIioI32a9XPBBRfgtttuw6RJk3DixAlcdNFFAIDDhw8jMTGxx+/zhz/8AQsXLkRcXBzq6uqwcuVKbNq0CWvXru1Ls6gPzhsdgW1PnIvogK57VKYlnhZUdG09KmNtQSWrvB6NLa14bUMmfJQCHlswqsP3slpFXP7WdlQ1tGDXk+c5LTpHRETkqE89Km+99RbS0tJQXl6Or7/+GiEhIQCAvXv34vrrr+/x+5SWluLGG2/EyJEjcd5552Hnzp1Yu3YtLrjggr40i/ooNsiv0/oUuyCdGiNts3+Atlk/ABCu1yLUXwOrCPzxm0N4d0sW3tp4ymkjQ0cnyupQWNOEJrMFBdVn1gNHRESDW596VAIDA7FixYp2x5999tlevc/777/fl48nN5meFIzjpXUAnGtUAGn4Z8uJcqzKKJSP7cuvQWxQ+0XkdudUy9+X15kwOmqAGkxERF6vTz0qa9euxbZt2+THb731FiZOnIgbbrgB1dXVXbySvJljnYpjjQrQVlALAIKtc2ZfXk2H77Mnp0r+vqKe9UhERNS5PgWVxx57TF4V9uDBg3jkkUewaNEiZGVl4eGHH+7XBpLnOGtYMNRKBUJ0aug1zp1x42KkoKJTK/HQ+SMASD0qHdnj0KPCoEJERF3p09BPdna2vCjb119/jYsvvhh/+9vfkJ6ejkWLFvVrA8lzhOu1+PLOGfBVKyEIzjUtC8ZG4ndzkzF7RBjC9Bq8sv4EDhbWwmyxwkfZloeLappQWNNWl8LVbImIqCt9CipqtRqNjVKh5IYNG3DTTTcBAIKDg7n/ziA3KT6ow+M+SgUev1Ca5WO1ijBoVTA2t+J4SZ28WBwA7Ml1HhqssG1ySERE1JE+Df3MmjULDz/8MJ577jns2rVLnp584sQJxMbG9msDyfsoFAJSbeuyZJw2/GOvTwm2rWzLoR8iIupKn4LKihUroFKp8NVXX+Htt99GTEwMAOCHH37AhRde2K8NJO9kX0Du9IJa+4yfBWMjAHDoh4iIutanoZ/4+Hj873//a3f81VdfPeMG0eAgB5X8tqEeY7MZx0qkocELx0Xhi1357FEhIqIu9SmoAIDFYsHq1atx9OhRCIKA0aNHY/HixVAqlf3ZPvJS9qByqrwBtU1mBPj6YF9eDUQRSAjxw+goafG4qoYWWKwilN0sOEdERENTn4LKyZMnsWjRIhQWFmLkyJEQRREnTpxAXFwc1qxZg+Tk5P5uJ3mZEH8N4oJ9kV/VhAMFNThneBj22+pVJsUFIthPDUEArCJQ2WBCuF7r3gYTEZFH6lONyv3334/k5GTk5+cjPT0dGRkZyMvLQ1JSEu6///7+biN5qakJ0gJxu7OlAtr9BTUAgNS4QKiUCgT72Qpq6zjzh4iIOtanHpXNmzdjx44dCA52WKk0JATPP/88zj777H5rHHm36UnB+CajEDuzqyCKIvbl1wKAPCMoTK9BZUML61SIiKhTfepR0Wg0qKura3e8vr4earW6g1fQUGRfcj8jvwY5lY2oqDdBpRDk5fZDbfsFceYPERF1pk9B5eKLL8Ydd9yBnTt3QhRFiKKIHTt24K677sKll17a320kLzUsVIdQfzVaWq34eHsOAGB0lAFaH6ng2r4DM3tUiIioM30KKm+88QaSk5ORlpYGrVYLrVaLmTNnIiUlBa+99lo/N5G8lSAIcq/Kv/fkAwBS49pWqQ3TSz0qDCpERNSZPtWoBAYG4ttvv8XJkydx9OhRiKKIMWPGICUlpb/bR15uemIwvj9YgsYWCwAgNTZQfs4+9MNl9ImIqDM9Dird7Yq8adMm+ftXXnmlzw2iwWV6UojTY/v6KgBrVIiIqHs9DioZGRk9Ou/0XXVpaBsZqZc3KPTXqDAszF9+jkM/RETUnR4HlY0bNw5kO2iQUioETEsMxk/HyjA+JsBpBdq2oR8GFSIi6lifimmJeuPi1CgAbRsR2tl7VCobWtBqsbq8XURE5Pn6vNcPUU9dPikWM4aFIOK0ZfKDdWoobMvoVzW2tFtG/8GVGThUZMTXd81EgJ+PK5tMREQegj0q5BJRAb5QnLbxoFIhIFjX8TL6DaZWfLu/CCfL6vH9oWKXtZOIiDwLgwq5lTzz57Q6lcNFRoii9P2aAwwqRERDFYMKuVWEQRrusW9caHewsFb+fvupClSy4JaIaEhiUCG3umpKLADgnS2ncLykbf+oQw5BxSoC6w6Xdvoeor3rhYiIBh0GFXKriydE4YIxETBbRDz+1X559s+BghoAwFm2JfjXHCzq8PV/+vYQZv19I44WG13SXiIici0GFXIrQRDwl8vGQa9VYX9BLT7anoN6UyuyKhoAAL9fOAoA8OupynbrrVitIr7eW4DCmibc+tFulBmbXd5+IiIaWAwq5HYRBi2WLRwNAHhvaxb259dAFIGoAC0mxQchNTYAVhFYf8R5+KewpgkNtj2Eimqbcdsne9DY0ury9hMR0cBhUCGPcNWUWITpNSg1mvDiuuMAgHEx0k7Lc0aGA2hfcHvMVtMSE+iLID8fHCioxae/5rqw1URENNAYVMgjqFUK3DgjAQCwL78GADDBFlSmJgQBAPbkVju95pitLmV6UjDunpvs9FoiIhocGFTIY9xwVjzUqrYfyXGxUlCZFB8IQQDyqhpRVtdWh3KsVOpRGRWpx9ho6dwjLKolIhpUGFTIY4T6a7A4NVp+PN7Wo6LX+mBkhB4AsDenrVfFPp15ZKQeo6MMAIDcykbUNZtd1WQiIhpgDCrkUW49Jwk+SgGjIvXyqrUAMDVRGv7Zaxv+aTZbkG2bGTQq0oBgnRpRAdLicY7rsQBAVnk9VqUXcL0VIiIvxE0JyaOMijTghwdmw+Dr/KM5NSEYn+3Ik+tUTpbVw2IVEejngwiDFGhGRxlQXNuMI8VGTE0Mll/70L/3Y39+DcL1WswaHuq6iyEiojPGHhXyOCnh/u12Up5iK6g9XFSLZrOlbdgnQg9BkDY7HGMb/jlS1FanUttklhePyyxz7mkhIiLPx6BCXiE2yBfheg3MFhH782tw3KGQ1m5MtBRUHFepTc+tljc3LKhucl2DiYioXzCokFcQBEGuU9mTWy2voTLK1osCQC6oPVZSJy/Fvyunbe2V/KpGVzWXiIj6CYMKeY2pCVLdyWsbTmBHViUAacaPXUKwH/zUSpharciplAptdzksEsceFSIi78OgQl7juulxmDMiDGaLiJZWqcdkRERbUFEoBLlX5XCREc1mi1yfAgAF1exRISLyNgwq5DX81Cp8fMt0/Ov2s3DO8FD89uxE+GucZweNjpKCy5FiI/bl18BsERHk5wMAMDa3orbJjMp6E859aROe/e9hl18DERH1Dqcnk9eZmRyKmckdTzMeEyUtErf+cClMZqnX5eyUUGw/VYmqhhYUVjfhaLER2RUNyKlswC1nJyEu2M9lbSciot5hjwoNKuePCUeITo2sigZ8tD0HAHBWUjBig3wBAPnVjThYWAsAEEXgi1157moqERH1AIMKDSrhei2+vDNNXqUWAKYlBSMuSOo1KahuwuGiWvm5L3fnw9RqcXk7iYioZxhUaNBJCffHf+5Kw+goA6YnBmNEuF7uUcmrbMBh24JwfmolKhta8MPBEnc2l4iIusCgQoNSbJAfvr9/Fv59VxoUCkEOKlszK9DYYoGvjxJ3zB4GAPh0R26P3lMURZTXmQaszURE1B6DCg1a9qX1ASm4AECWbSPDMdEG3HBWPFQKAXtzq5FjO96VV9afwLS/bsDmE+UD02AiImqHQYWGhLhgX6fH46INCNdrMc22eeGm42Xdvse2kxUAgEOFtd2cSURE/YVBhYaEmEDnKcjjYqRpzHNGhgFAt70koijiZFk9AMDYZB6AFhIRUUcYVGhI8FUrEeqvlh/bg8pcW1D5NasSzebOZ/+U15lQ19wKQNqRmYiIXINBhYaMGFudilqlQEq4PwBgZIQekQYtms1Wp32BTmfvTQEYVIiIXIlBhYaMONvMn9FRBvgopR99QRAwZ4TUq7LpeOfDPyfLGVSIiNyBQYWGjGGhOgDAxNgAp+P2OpVNJzovqHXsUTE2M6gQEbkK9/qhIWPpzET4qlW4cnKM0/GzU0KhVAjIKm9AflVjh3v/cOiHiMg92KNCQ0aIvwZ3z01GuEHrdDzA1weT4gIBSEW1HXEKKo0MKkRErsKgQgRgoi2oHLEtr+/I2GxGmcOKtHWmVlitoquaRkQ0pDGoEEEqsAWAI8Xtg4q9NyVYJ01vFkXIU5WJiGhguTWoLF++HNOmTYNer0d4eDguu+wyHD9+3J1NoiFqTLQUVI4WGyGKzr0l9qAyOkoPrY/0K8M6FSIi13BrUNm8eTPuuece7NixA+vXr0drayvmz5+Phobu910h6k/JYf7wUQqoa25FQXWT03P2oJIS5o8AXx8ADCpERK7i1lk/a9eudXr84YcfIjw8HHv37sXs2bPd1CoaitQqBYaH63Gk2IgjxUanmT9yUAn3R0CWD0qNJgYVIiIX8agaldpaabO34ODgDp83mUwwGo1OX0T9xT7841hQ22y24HCR9HOZHM4eFSIiV/OYoCKKIh5++GHMmjUL48aN6/Cc5cuXIyAgQP6Ki4tzcStpMLMX1B61FdSKoognvzmEUqMJQX4+mBAbyKBCRORiHhNU7r33Xhw4cABffPFFp+csW7YMtbW18ld+fr4LW0iD3ZjTZv58uiMXX6cXQCEAb14/Gf4aFQy2oMLVaYmIXMMjVqa977778N1332HLli2IjY3t9DyNRgONRuPCltFQYg8qBdVN2HCkFH/+7xEAwLKFozFreCgAwKB17lEpMzZDq1bKx4mIqH+5tUdFFEXce++9WLVqFX7++WckJSW5szk0xAX4+SAmUNq48Hefp6PVKuLS1Gjcdk7bz6Xj0E9tkxnnvrQJl731S7spzURE1D/cGlTuuecefPbZZ/jXv/4FvV6PkpISlJSUoKmpqfsXEw0Ae51Ki8WK0VEG/P3KCRAEQX7eMaicKK1DQ4sFWeUNKHdYuZaIiPqPW4PK22+/jdraWsydOxdRUVHy15dffunOZtEQNtY28yfQzwfv3jgFvmql0/P2oGJsMiOnom29H8cVbbm8PhFR/3FrjQq7y8nTLDkrHsW1Tbh+enyHuyg79qjkVTXKx4+V1GHuyHD8e08+/vjNIbx+3UQsHB/V5WfVNLbgH5tOYVZKKGaPCOvfCyEiGiQ8opiWyFOEG7R44arUTp8P8GsLKrmVDkHF1qPy1d4CtFis+PP/juDcUeEQBODhf+9HcU0TJsYFYVJ8ICbFB6K2yYy7PtuL/Kom/HCoGFsfn9dt215cdwwnSuvx9pLJUCk9ZsIeEdGAYlAh6gXHHpVchx6Vo8V1aDZbsC+/BgBQXNuMT37NQVFNM9YcKAYApOfVAL+0f8/8qiZU1JsQ6t/5jDaLVcS7W7Jgtog4VlKHcTEB/XZNRESejP9ZRtQLndWonCqvx56carS0WuVjr6w/gY+25wAAHr5gBJamJWBCbABUCqk4d+7IMCSGSMNL+/JquvzcEmMzzBZpqLSktrm/LoeIyOOxR4WoF+zrpVjFtrVUdGolGlos+NeuXADAhWMjkVVRjxOl0h5Bd84ZhvvPGy6/R7PZgop6E2ICffH4VweQU9mIffk1OH9MRKefm+/Qe1NsZFAhoqGDPSpEvaD1UUDtUB8SptfIwzDrDpcCANKSQ7Bs0WgIAjA9KRiPzh952nsoERvkB0EQMDE+EACQkV/d7rMci80dC3dLajl9n4iGDgYVol4QBEFeRh8AEoL95LVXLLZpydOTgnHuyHBsenQuPr11Ony6KHydGBcIADiQX+s0rXl3ThWm/XUDVqUXAAAKHHtUatijQkRDB4MKUS8F+LaNmMaH+GFUpF5+bNCqMDJCepwQooNGpWz3ekcjI/Tw9VGiztSKU+X18vENR0pRUd+Cb/cVAQDyq9t6UYpZo0JEQwiDClEvBTj0qCSG6DDK1qMCSL0pCoXQ0cs6pFIqMD5WGjrKsM0YAoD8aqkH5ViJNO3ZqUaFQz9ENIQwqBD1kmNQSQjxw8gIPeyr7E9PCu71+02yDf9kOMz8ya+Swkip0YSqhhY5uABSjwoXSySioYJBhaiXnIOKDr5qJVJjA6FUCH1aYdZep7Kvgx4VANhfUINSY9teQqZWK2oazb1vOBGRF+L0ZKJeCjitmBYA3r1xCsrqTBgVaejsZZ2yz/w5XmJEY0srLFbRKYj8dFSaTaRTK6H1UaKyoQVFtU0I0qnP4CqIiLwDe1SIesk+60evVSHQtqR+uEHb59ViowJ8EeqvhlUETpTWy8M+dhuOlAEA4oL9EBWoBcBF34ho6GBQIeole49KYogOgtDzwtmu2HtijhUbnYZ9AGlVWgCIDfJDVIAvAKCIQYWIhggGFaJesq+bMiUhqN/ec6RtivOxkjp5hs/oKOdhpLhgX0QF2HtUOPOHiIYG1qgQ9dLZKaHY9sS5iDRo++097WuxHC+pk4/NSglBTkUDmswWAEBckB+aW6XvuZYKEQ0V7FEh6oPYID+oulhxtrfkoZ8So9yjEh+iw4gIf/mcuGA/RNuGfrg6LRENFQwqRB5geIQ/FAJQ3WiWpynHBfk6zSKKD/ZDpH3ohxsTEtEQwaBC5AG0PkokhuoAAJUNLQCkHpRRUW3L88cGtdWoFNU0cdE3IhoSGFSIPMTo09ZgiQn0lQtqQ/3V0GlUiLDVxXDRNyIaKhhUiDzESIfNDSMMGmh9lJiWGIybZybijxeNASD1vITYFnpjQS0RDQWc9UPkIRx3YY4Lkla8VSoEPHPpWKfzIgO0qGxoQXFtE8ZESz0uFqsIURT7tcCXiMgTMKgQeQjHwtk429L8HYkN8sXhIiP+uuYo1CoFdmdX4f1t2RgVZcC/70yDshe7NxMReToGFSIPERvkC51aiYYWC+KCfDs97755w5GRV4Osigbc+P4u+fje3GqsPVSCiyZEuaK5REQuwX5iIg+hUAgYZSuejQ/RdXreuJgArH9oDq6cHAsASA7T4cKxkQCAFRtPcjYQEQ0q7FEh8iBPXDgK/ztQhAvHRXZ5XoCfD16+JhVPLByJEJ0GxiYztmSW42ixERuPl2HeqAgXtZiIaGCxR4XIg0xPCsafF4+Dv6Zn/w0RrtdCqRAQpFPjNzMSAABv/tz3XpW6ZjNqGlv69FoiooHAoEI0SNw2KwlqlQIZeTX4JqOw16+3WkUsXvELLnxtKxpMrQPQQiKi3mNQIRokwg1a3HtuCgDgj6sP4WRZvfxcs9mC1zdk4uPtOZ2+vrzehKyKBpQYm7Ezu3Kgm0tE1CMMKkSDyD3npmBmcggaWyy491/pyK9qRHmdCTe8twOvbjiBp787jL25VR2+trCmSf5+y4kKVzWZiKhLDCpEg4hSIeC1ayci1F+NYyV1OOeFjZj5/E9Iz6uRz3n5xxMAgM0nynHV29uRkVcNQNo/yG7bSQYVIvIMDCpEg0y4QYv3bpqKyfGBUCkEmC0ikkJ1+PTW6fBRCth+qhL/t/kU7vx0D/bkVuPfewoAOAeVk2X1KK5t6uwjiIhchtOTiQahSfFBWPW7s9HUYkFWRT1Swv2hUSlx/fR4fPJrLp7/4Zh8bm5lAwCgqMZ576CtmRW4ZmqcS9tNRHQ69qgQDWK+aiXGRgdAo1ICkGpYNCrp1z7UXwMAyKmQgoq9RiVMLx3flsnhHyJyPwYVoiEkwqDFc4vHYdH4SHx223QAQFFtM5rNFnnox77i7baTFXjmu8OY/cJGrD9S6rY2E9HQxqBCNMRcMy0O/1gyBSMj9NDbFpbLq2qUg8rFE6KgUytR1dCCj7bnIK+qER9sy5Zf/8PBYnz4S3aH701E1N8YVIiGKEEQkBgq7Sl0tNiI6kYzACA+xA+XpEYDAFJjAwAAe/Oq0Wy2oN7UigdW7sOz/z2CE6V17mk4EQ0pDCpEQ1hCiB8AYPtJaYE3vUYFg9YHf148Drv+cB5W33M2wvQatLRasS+/Btsyy9FisQIADhfVuq3dRDR0MKgQDWFJth6V7VlS4Wx0oC8AQK1SINyghSAISBsWAgDYkVWJn46Wya89WsweFSIaeAwqRENYQogUVPKrpPqU6EBtu3Nm2ILK9pOV2HjcMagYXdBCIhrqGFSIhrCkUD+nxzFBvu3OSUuWgsqunCpU1LftrGwPKqZWC/65NQsF1Y0D2FIiGqoYVIiGMHuPip196MdRYogfIgwa+fHckWFQCEBFfQvK6prx4S85+Muao7jn83SIojjgbSaioYVBhWgIC9Gp5SnKABDTQVARBEEe/gGAReOjHGYL1WHtoRIAwP6CWmw5bZG41RmFmPTnHzvdCJGIqDsMKkRDmCAISHAY/umoRwWAXFALAOeODMfoKAMAYNPxMuzLr5Gfe+OnTKdelS925aG60YxV6YX93HIiGioYVIiGuESH4Z/Ogsq80eEI1qlx4dhIhOk1GGMLKv/amQcASAn3h1qlwN7cavx6SprqbLGKOFgoTWE+UMCpzETUN9yUkGiIswcVhQBE6DUdnhOu12L3k+dDsD0eHaUHAJhapTVVrpoSi+KaJnz8ay7e+DkTM1NCcaK0Do0tFgBS4W2z2QKtj3JgL4aIBh32qBANcfZ6k0iDFipl5/+XoFQIUCikqGIf+rGbPyYCd85JhiAAO7KqUFLbjIy8Gvn5VqvY6XTm8joTXvnxOKoaWjp8noiGNgYVoiHurKRgaH0UODsltMeviTRoEejnA0Aa9hkW5o/oQF9MjAsEAGw4Wop9+dVOr+ls+OflH4/jjZ9P4sV1x/t2AUQ0qDGoEA1xccF+yHhqPl64akKPXyMIglynsmBshHz8gjHS91JQqQEAjI2WzttfUANRFPH2plP4fGcuAEAURWw+UQ4AWH+kFFYrpzcTkTMGFSKCr1oJQRC6P9HBg+ePwOWTYnDL2UnysQtGS0Fl+8lKZJbVAwCWpiUCkHpUNp0ox9/XHsOT3xxCQXUjTpbVo7i2GQBQUW9ChsMMIiIigMW0RNRH05OCMT0p2OlYSrg/EkL8kFsprVIbE+iLeaPDAQCnyuvxwtq24Z1v9xW1K65df6QUUxKCBrjlRORN2KNCRP1GEAS5VwUAJsYHItRfg5hAX4ii8/5AqzMKscU27JNqq2358UiJS9tLRJ6PQYWI+tX5Y9qCyiRbAEmNC5CPXTM1FmqVApll9dh2UlrJ9qmLRsNHKSCrvAEnbUNGPWW1iqhp5IwhosGKQYWI+tXUhCAE69TS94nS0NCE2EAAgEalwKMLRsq9LhariHC9BlMSgpCWLM06Wn+ktFef9/zaY5jylw34/mBxP10BEXkSBhUi6lcqpQLv3TQFL12dKk9XviQ1GiMi/PH7haMQrtdi8cRo+fxzhodJQ0a2npi1h3oeOKxWEavSC2Gxinhq9SFUcy0WokGHQYWI+t2UhGBcNSVWfhwT6IsfH5qD39pmCM0dGS6vwzJ7hNSTcuHYSCgEaXPD7IqGDt/XbLHiyW8O4qu9BQCAI8VGVNSbAACVDS34y5qjA3ZNROQebg0qW7ZswSWXXILo6GgIgoDVq1e7szlE5CJqlQIvXpWKW85OwsJxUQCAML0Gs4aHAQC+3dfxJoZbTpTj8515ePKbg6htNMtrsCSH6SAIwNfpBdiaWe6aiyAil3BrUGloaEBqaipWrFjhzmYQkRtcMCYCf7pkDNSqtv8bunySNCS0OqPQaRdmO/sicqZWK1ZlFMhB5eazk+T1Wt74KXNgG05ELuXWdVQWLlyIhQsXurMJRORB5o+JhK/PIeRUNmJ/Qa1c42K3z2FBuI+356CgugkAMGd4GC4YHYFPfs3B7pxq5FY2IMFhV2gi8l5eVaNiMplgNBqdvoho8NBpVJhvW5J/dYbz8I/VKspBRRCAnMpGtFpFDAvVIT7ED5EBWnno6Ot06bUbjpTivS1ZvVqav9TYjCX/3IEvduX1wxUR0ZnyqqCyfPlyBAQEyF9xcXHubhIR9bPLJsUAkOpUssrb1lTJqmhAXXMrtD4KXD4xRj4+e0SY/L29gPfrvQXYk1OFOz/bi79+fxSrO6h5+W5/kbzgnKOX1h3HLycr8e6WrH67JiLqO68KKsuWLUNtba38lZ+f7+4mEVE/OyclFMNCdahuNOOyt36Rw4S9N2VcdABuTEuQz58zsi2ozB8TAb1WhcKaJvz2w92w2HpSXv7xBEytFvm8L3bl4f4vMnDrx7tRXmeSj58sq8PX6dKMotzKBqfXEJF7eFVQ0Wg0MBgMTl9ENLiolAqsvHMGJscHwtjcips/3IWdWZXYl18NAJgYF4iJcYG4JDUa05OCkTYsRH6t1keJiydIBbl1plYkhvgh0qBFYU0TPtshDeXsza3Cn749BAAwW0T8e0/bf/C8/OMJ2EeJrCI6nSZNRK7jVUGFiIaGcL0WX9wxAwvHRcIqAk9/dxjpuTUApP2DBEHAm9dPwr/vTGu3seHVU6XhH7VSgRU3TMaD5w8HAKz4ORPPfHcYd366F2aLiLhgXwDA5ztyYbGK2J9fgx8OlUAQgKgALQAgs7R3y/kTUf9za1Cpr6/Hvn37sG/fPgBAdnY29u3bh7w8FrERDXUalRJ/vXw8DFoVjpXU4YhtQ8PTZwKdbnJ8EN68fhI+vXU6xsUE4KopsUgOk4aSPtqeg4r6FoyM0OPbe2YhyM8HRbXN+PeefNz7RToA4PKJMZhtK8q17zv04rpjmPqX9Siobhy4CyaiDrk1qOzZsweTJk3CpEmTAAAPP/wwJk2ahD/96U/ubBYReYhgnRoPnj9Cfmzfibk7l6RG4yzbkJBKqcBr107C5ZNicOfsYVh+xXh8dXcagnVqXD1VKshftuog8quakBDihz9cNBrDI/wBSEHFahXx+c48VNS3YMuJigG4SiLqilvXUZk7d26HizoREdndmJaAz3fm4lR5AybGScM+vTU+NgCvXjux3fElZ8XLs3tCdGp8/NvpCPXXIDlcCiqZZXU4XlqHmkYzACCnkjUrRK7GGhUi8mg+SgVevDoVE2IDcPPMxH5974QQHa6eEosQnRrv3zwNiaHSInHDbUElu6IBv5xs60XJYXEtkcu5tUeFiKgnJscH4bt7Zw3Ie794dSqsVhEKRVtPTXSAL/zUSjS2WJxmBTn2qJworUOovwbBOvWAtIuIJOxRIaIhzzGk2B8nh0m9KiccZv7kVjbCahWRWVqHha9vxe2f7HFpO4mGIgYVIqIO2Id/AMDXRwmVQoCp1YoSYzO2n6qExSpib241yozNbmwl0eDHoEJE1IGUiLagMjUxCHHBfgCkOpUDBbXyc9tOciYQ0UBiUCEi6kBKWFtQmTEsBIkhtqBS2YiDhTXyc9syOw4q5XUmfLe/CIeLajt8/nSf/pqDez5Ph7HZ3PdGEw1CLKYlIurA8Ai9/P2MYcG2PYHKcaS4Vl4IDpB6VERRlKdNZ5bW4bGvDsh7E/koBSy/YoK8YWJH6k2t+Ov3R9FstiIu2A+/XzhqQK6JyBuxR4WIqAPxwX4YFanH8HB/jI8JRJJt6vLaQyWwitLic1ofBcrqTMi0BZeqhhbc8vFuOaREB2hhtoh49D/7sfz7o6hpbOnws9YdKkGz2QoA+PCXbBTXNnXZttpGM97aeBIV9aYuzyMaDNijQkTUAaVCwPf3nwOrKEKlVMhrrFTUS2FjUnwgms0WbM2swNbMCiSF6nDP5+nIr2pCfLAfVt4xA5EGLV5efxxvbTyFd7Zk4aPtObhwXCRGROgRHajFgrGR8FOrsHpfIQDIBbuvrc/E36+aILclv0paut9eJ/Py+uP45NdcpOdW4/2bp7nyn4XI5dijQkTUCYVCgEop/d+kvUbFbkJMAM4ZHgoA+G5fIX774W78mlUJP7US7900FdGBvlAoBDy2YBTeumEyRkXqYWq14tt9RXhx3XE89OV+XP1/vyKvslFeVO6lq1MBAP/Zm48TpXUAgFPl9Zj/6hYsemMrahpb0Gqx4n8HigEAPx0rw6HCntXAEHkrBhUioh6ICfSFymG9lfGxATg7RQoq+wtqse1kBVQKAa9eOxEjI/VOr71oQhR+eOAcrPrdTNw3LwVXTYlFoJ8PDhcZcc07v8IqApPjA3HZpBjMHxMBqwjc9dlelNeZ8PCX+9BktqCuuRVf7s7HL6cqUdXQNoS04ueTrvkHIHITDv0QEfWASqlAXLAfsm3L6E+IDUSgrw9GReqRWVaPKybF4J5zU+QhotMJgoDJ8UGYHB8EANh+qgI3vr8LJbZ1WC6fFAMAeO6ycThUWIus8gbMf3UzqhvNEARAFIFPfs3F9KRgAMDZKSHYfqoSaw+X4HhJXbtwRDRYsEeFiKiH7MM/sUG+CNapoVAI+PrumUj/4wV48erUTkNKR2Ymh2KZbXaPSiHgognRAIAIgxYf3TIdeq0K1bbNEP9+5QQE+fmgsKYJ32RI9SwPnDcCC8dFAgBWbGSvCg1eDCpERD1kDyITYgPkYzqNCgF+Pn16v1tnJeEvl43DW0smO+0ZNCJCj3dunIIwvQZL0xJwzdQ4XDc9Xn4+KkCLqQlBuPfc4QCA7w8Wo6im65lCXWk2W3Dl29txz7/S+/weRAOFQYWIqIdumB6PaYlBuHXWsH55P0EQ8JsZCVgwNrLdczOTQ7Fz2Xl4dvE4AMBvZiRAaauRuXhCFBQKAWOiDUgbFgKLVcSnO3L73I4DBbXYm1uNNQeKuUM0eRwGFSKiHhoeocd/7pqJKQlBLvk8x80SYwJ98Zuz4mHQqnC9Q+/Kb89OBAB8sSsPTS0W5FY24L/7i2C1igCAVosVL647hpfWHZfra053oKBG/v7nY2X9fyFEZ4DFtEREXuLZxePkHha780ZHIC7YF/lVTfj9qgNYf6QUjS0WlNWZcOusJKw5WIy3Np4CINWyXDAmAm9ePwlaH6X8Ho5TnH8+VoZbZiW55oKIeoA9KkREXkypELA0LREA8O2+IjS2WAAAH2zLhtlixQe/5ACQCoEVArD+SCm+2JXn9B4HHYLKzuxK1JtaXdJ2op5gUCEi8nJXT42DQSt1kN9+ThJC/dUorGnCX9ccxf78GqiVCnx190w8d5nUG/OPTafQbJYCTb2pFVm2IaEwvQZmi4htmeVdfl5lvQnpedUDeEVEbRhUiIi8XICvD769dxb+d98sPHnRGNxk62H5aHsOAGDxxGiE+mtw9ZQ4xAT6orzOhM93Sr0qhwtrIYrSTKJLbFOkfzxcilfWn8DsFzbiP3vynT7LYhXxm/d34Yp/bMf/DhS1a0uDqRXZFQ0oq2tGS6t14C6ahgwGFSKiQSApVIdxMdK06RtnJEDr0/Z/7789W6o5UasUuOfcFADA/22WelXswz7jYwJw3uhwAMCqjEK88VMm8qoa8dhXB/Dq+hMQRak49+v0AhwtNgIA/rbmKJpsQ03ldSYs/+Eopv91A859aROm//UnpD77o7xBoycztUpFyOSZGFSIiAaZIJ0a10yNAwCclRSMMdEG+bmrpsTKvSrvbcmSC2nHxwRgWmIw/DXSEJJeq8JlE6Ueltd/ysSDX+5DdUMLXvnxBACpNqaothn/t/kUVu7Kw+wXNuKdzVloaLFA66OAIABNZgv+8r8jcshxhQ1HSuVNHHvqxbXHMefFTdh0fPDOeKptNKO6oePduz0dZ/0QEQ1Cjy0YiWCdGldOjnU6rlYp8NiCkXjwy314c+NJGLTSYnXjYwOgVinwp4vHYPupCjy6YCRig/xw1rAQ/HH1IXy7rwg/HytDXXMrYgJ98cj8EXj43/vxxs+ZsOeQ1NgAPHD+cJw7MhxldSbMeXEj9uRWY8PRMlwwJqJX7a9uaEGJsRmjowzdn2yzLbMCt32yB0mhOmx4eI687kx3frJNyd54rAxzR4Y7PddqsaLVKjrNkvI2ZosVi97YilarFT8/Mhc6jXf96WePChHRIKTX+uDB80cgLtiv3XOLJ0bjnOGhaGm1oqLeBEDqUQGAa6bF4bXrJiE2SHrd9dPj8fltZyHUX4O6Zmk20KMLRuDySTGYnhQMUZS2AFi2cBS++d3ZmDcqAoIgIMKgxS22IacX1h7Df/bkY/GKbbj3X+ndLipX1dCCRW9sxcLXt+KfW7OcnjNbrLjhvR246YNdMFuca2B+PFICAMiuaMBGW/iorDdh84nyTnt1apvM8voyB0/biVoURfz2o904628/ofAMVv51t7yqRhTWNKHUKP1beBvvilVERHTGBEHAXy4bh/mvboGp1YroAC1C/DWdnj9jWAjW3D8Lz/73MHRqFRanxkAQBLx27UR8tD0HF0+IwoTYwHavu3NOMv61Kw+ZZfV47KsDAKSdptcdLsH0pGDkVDSissGEWSlhuCQ1CvPHRELro8DjX+1Hca20WeNf1hyFIAi41ba2y7bMCmw/VQkAeH9bNu6akwxAChWOi9V9uD0bZ6eE4rp3dyCzrB4vXjUBV9uGwxwdLGgLJ4eLjGi1WKFSSv8Nvyu7ClszKwAAX+zMw6MLRvb439iTZJW3BcO1h0qwaHyUG1vTe+xRISIaghJCdHjoghEAgBnJId2eH2HQ4h9LpuDFq1PlFXOjA33xh0WjOwwpgDQb6WHbZ4TrNXjkghGYPSIMZouIX05WorCmCc1mKzYcLcUDK/dh5vM/4c5P92LD0TKolQpcPUUatnruf0fw/cFiAMC3+wrl9399QyYKqqV6lFPlDSioboKPUoBCAH45WYm7P9+LzLJ6AMAbP2e264EBgP0Oq/KaWq3y+QDwz23Z8vf/3pPf4eu9QVZ52zX9fKwMplaLG1vTe+xRISIaou6cPQwT4wJ7VQfSWzelJeLslFDEBvlCo5LqPH49VYmsinqkhPlDp1Fh3eESrEovRGFNE348UgoA+MOiUVg6MxF6rQ8++CUbL647jnOGh8rP21fjfea7I/jn0qlyIeyMYSHQqVVYe7gEm45Lwxx6jQr5VU34Jr0Q10xz7lXZf9qspIMFtRgdZUB2RQM2HJU+S69VoazOhJ+PlXW4L1NfGZvN0KlVPa6l6SvHHpV6Uyt+OVmBeaN6VzPkTuxRISIaogRBwIxhIQjw7dvuzz2VHOYvhxQASEsOwZKzEnDWsBCMiwnAI/NHYvNjc/GPJZMxKyUUN89MxNKZiRAEAY/MH4EgPx9kVzTgwZX70NhiQVywLz5YOg0qhYANR6WVdu3DPueODJf3PwKkBfDuP0/aZXrFxpPYn1+DFT9nYvspaUjngG3oJzUuUHpcWAMA+PCXbIgiMG9UOJaclQAA7Vb07Yvi2iY88u/9OOeFnzHhmR9x+yd7zvg9u5NVIfWohOul4b21h0oG/DP7E4MKERG5nUqpwKLxUfjstrPwzKVjIQhSL4NOo8Ids6U6FPvsnMWpMRgeoZeHrp5afQi7sqsAAOeOCsf0pGAsOSsel6RG49EFI7FkRjxC/dXIq2rE4rd+wUs/nsDtH+/BkSIjSozNUAjADdOlnpaDhUZU1pvwnz0FAIDbZiXhOlsvzOYT5fJQU180tVhw60d78HV6AfKrpOLcn4+V4ZRtaCa/qhGf/JojrxrcW5X1Jqd9m+zsPSq3nSPV+aw/UopWLxrGYlAhIiKPdlNaAoL82np9FtvWd/nd3GRcmhqNVquIVquIxBA/JIXqIAgC/nr5eLx5/SRoVEr4qVW4b57Uq6L1USDUX42GFgseWJkBABgerseMYVKdztFiI15YexxNZgvGxwQgLTkEiaE6nJ0SAlEEPtvRvldla2Y5XvnxOOqazZ1egyiKeHL1QRwpNiJEp8bHt0zHOcNDAQBf7y2AKIq4+/O9+NO3h/HE1wd6vfaMfYbSJSu2OQ1n1TaaUWlbP+XaafEI8vNBdaO5y9k/hwpr8fwPx1Db1Pn1uBKDChEReTTHXpWx0QYMj9ADkIauXrhqAibHBwIAzh/ded3FTWkJ+PGh2Uh/6gK8ft0kAJALZyfEBiA+2A8GrQotrVZ8ads24I8XjZZ7dm6eKfVGfLYj1+kP+K7sKtzy0W688fNJXPfuDpTVNXf4+St352NVeiEUAvDmDZMwZ0QYrpsWDwD4JqMQ6w6X4lChtOLvt/uK5C0O7AqqG3GyrK7T6ztcZMSBAmk7BHvhMQCcsg37RBg0CPD1kWc+Pf/DsU57VZ769hD+b/Mp/Pm/Rzr9PFdiUCEiIo932zlJePbSsXj9uolOx7U+Snx0y3S8cNUE3H/+8E5fLwgCRkTo4adW4eyUULk3AwAmxAVCEASn2UuLxkfirGFts6HOGxWOkRF61Jta8dmOXADSUM1dn+2F2SJCEKSwcOXb29utjNvSasUr66UVfR9bMAozk6XPPm90OAxaFYprm/H7VdL07eHh/gCAP//3CN7edAr/3V+Ee/6VjtkvbMTC17fiWIkUZlotVny+M1de+v+rvQXy59mLgIG2YZ/kMOl97zk3BUF+Psgsq28XhgBpKwT7tgdfpxfgV9tUcHdiUCEiIo/no1Rg6cxEpITr2z1n0Prgmqlx8iq7PfHEhaPk71NjpcXu7HslqVUKLFs42ul8hULA3XOlXp0PtmVj4/EyLP1gF6oaWjAuxoDv7z8H8cF+yK9qwu8+T3fakPHHIyUorzMhTK+R14MBpJB1Sao0jFXTaIa/RoUv70zDBWMi0GKx4u9rj+G+LzKw5kAxrCJgtoj49FcpJH34Sw6e/OYQlvxzJ2oaW/Dd/rYNIk+VN8iL6tmnJg8L0wGwTRmfL60H8+qGE6hpdF5Wf+OxMjiOOj25+qDbpzMzqBAR0ZAzLiYAz102DveemyKvyntpajRC/dV44sJRHa7oe/GEKMQF+6KyoQW//XA3sioaEGHQ4L2bpmJ0lAFf3jkDgX4+OFhYi5fXH5dfZw8X10+Ph1rl/Gf3yiltWxz89uxEBOvUeO3aiXh0/ghcNCEKE+MCccXkGDy3eCwAaViouqEF79lW7C2obsK17+xAVUMLwvQaTE8KBtBWeGzvURkW6i9/zvXT4jAyQo+aRjNetu3dZGfvjbnl7CSE+muQVd6Adzc7rw7salxHhYiIhqQbZyQ4PR4TbcCeP17Q6fkqpQJ3z0nBH745CKVCwG/Oisf95w2XV/WNCvDF81dMwF2f7cW7W7IwIykEMUG+2JldBaVCwPXT26+MOykuEOcMD0VBdRNumzUMgFSTc+8852EsURTxwS85yK5owB2f7kFZnQmBfj6obTLjeKlUu3LZxGhEGLTYlV2Fn4+V4tZZSfLUZHuPiv06nr50DG54byc+25mLyybFYEpCEJrNFnkl3ismxyA1LgAPrNyHffk1EEVRrtdxNQYVIiKiHrp+ehzC9BqkhPsjKVTX7vkLx0Xi+unx+GJXHn770W5EBWgBABeMjkBUgG+78wVBwKe3ntXt5wqCFHT+9v0x7M6pBgDcP284SozNeHeL1ONxxeRYaH2U+Muao9iZVYWaxhbkVEj1MvYaFbuZyaG4akosvtpbgD+sOoj/3T8Lv2ZVoslsQaRBi7HRBoyNNiDIT41zhoe6LaQADCpEREQ9JghCtztB/+niMWhptWJVRoG8Z9GNaQldvqYnrpoSh5fWnUCLxYogPx9cNz0OCkFAYU0Twvw18grDw8J0yCpvwH1fZKDFYoVapUB0YPuQ9OSi0fj5WBmOl9bhsf/slzednDc6XA4ms0eEnXG7zxRrVIiIiPqRr1qJl69JxY8PzsZVU2Jxy9lJmNmD/ZS6E6xT41LbGjK3zkqCn1oFrY8Sb90wGc9cOlY+b+E4aZl/+zDOsFBdh8v0B+nU+NPFYwAAq/cVyXUt548OP+O29idB7O2qMh7EaDQiICAAtbW1MBgGbq8KIiIiT9DY0opd2VWYPTxM3hzydKZWCzYcKcPxEiPyqhpxxeTYLntG1h4qwfojpdibW4UIgxaf3DrdacuDgdCbv98MKkRERORSvfn7zaEfIiIi8lgMKkREROSxGFSIiIjIYzGoEBERkcdiUCEiIiKPxaBCREREHotBhYiIiDwWgwoRERF5LAYVIiIi8lgMKkREROSxGFSIiIjIYzGoEBERkcdiUCEiIiKPxaBCREREHkvl7gacCVEUAUjbRRMREZF3sP/dtv8d74pXB5W6ujoAQFxcnJtbQkRERL1VV1eHgICALs8RxJ7EGQ9ltVpRVFQEvV4PQRD69b2NRiPi4uKQn58Pg8HQr+/tCQb79QG8xsFgsF8fwGscDAb79QH9f42iKKKurg7R0dFQKLquQvHqHhWFQoHY2NgB/QyDwTBof/CAwX99AK9xMBjs1wfwGgeDwX59QP9eY3c9KXYspiUiIiKPxaBCREREHotBpRMajQZPP/00NBqNu5syIAb79QG8xsFgsF8fwGscDAb79QHuvUavLqYlIiKiwY09KkREROSxGFSIiIjIYzGoEBERkcdiUCEiIiKPxaDSgX/84x9ISkqCVqvFlClTsHXrVnc3qU+WL1+OadOmQa/XIzw8HJdddhmOHz/udM7NN98MQRCcvmbMmOGmFvfeM8880679kZGR8vOiKOKZZ55BdHQ0fH19MXfuXBw+fNiNLe69xMTEdtcoCALuueceAN55D7ds2YJLLrkE0dHREAQBq1evdnq+J/fNZDLhvvvuQ2hoKHQ6HS699FIUFBS48Co619X1mc1mPPHEExg/fjx0Oh2io6Nx0003oaioyOk95s6d2+6+XnfddS6+ks51dw978nPprfcQQIe/k4Ig4MUXX5TP8fR72JO/EZ7wu8igcpovv/wSDz74IJ588klkZGTgnHPOwcKFC5GXl+fupvXa5s2bcc8992DHjh1Yv349WltbMX/+fDQ0NDidd+GFF6K4uFj++v77793U4r4ZO3asU/sPHjwoP/fCCy/glVdewYoVK7B7925ERkbiggsukPeJ8ga7d+92ur7169cDAK6++mr5HG+7hw0NDUhNTcWKFSs6fL4n9+3BBx/EN998g5UrV2Lbtm2or6/HxRdfDIvF4qrL6FRX19fY2Ij09HQ89dRTSE9Px6pVq3DixAlceuml7c69/fbbne7rO++844rm90h39xDo/ufSW+8hAKfrKi4uxgcffABBEHDllVc6nefJ97AnfyM84ndRJCfTp08X77rrLqdjo0aNEn//+9+7qUX9p6ysTAQgbt68WT62dOlScfHixe5r1Bl6+umnxdTU1A6fs1qtYmRkpPj888/Lx5qbm8WAgADx//7v/1zUwv73wAMPiMnJyaLVahVF0fvvIQDxm2++kR/35L7V1NSIPj4+4sqVK+VzCgsLRYVCIa5du9Zlbe+J06+vI7t27RIBiLm5ufKxOXPmiA888MDANq6fdHSN3f1cDrZ7uHjx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o0fD398fF154IYqLi+XXtLa24v7770dgYCBCQkLwxBNPYOnSpbjsssu6vN7t27dj9uzZ8PX1RVxcHO6//340NDQ4tf25557DDTfcAH9/f0RHR+PNN990eo+8vDwsXrwY/v7+MBgMuOaaa1BaWup0znfffYepU6dCq9UiNDQUV1xxhdPzjY2NuOWWW6DX6xEfH4933323y3YTUfcYVIgGoddffx1paWm4/fbbUVxcjOLiYsTFxcnPP/7441i+fDmOHj2KCRMmoL6+HosWLcKGDRuQkZGBBQsW4JJLLkFeXl6Xn/Pss8/immuuwYEDB7Bo0SIsWbIEVVVVnZ7f2NiIl156CZ9++im2bNmCvLw8PProo/Lzf//73/H555/jww8/xC+//AKj0YjVq1d32YaDBw9iwYIFuOKKK3DgwAF8+eWX2LZtG+69916n81588UVMmDAB6enpWLZsGR566CGsX78egNSzdNlll6GqqgqbN2/G+vXrcerUKVx77bXy69esWYMrrrgCF110ETIyMvDTTz9h6tSpTp/x8ssvY+rUqcjIyMDvfvc73H333Th27FiX7SeibvTbPsxE5FHmzJkjPvDAA07H7FvXr169utvXjxkzRnzzzTflxwkJCeKrr74qPwYg/vGPf5Qf19fXi4IgiD/88IPTZ1VXV4uiKIoffvihCEA8efKk/Jq33npLjIiIkB9HRESIL774ovy4tbVVjI+PFxcvXtxpO2+88UbxjjvucDq2detWUaFQiE1NTXLbL7zwQqdzrr32WnHhwoWiKIrijz/+KCqVSqet6Q8fPiwCEHft2iWKoiimpaWJS5Ys6bQdCQkJ4m9+8xv5sdVqFcPDw8W3336709cQUffYo0I0BJ3eE9DQ0IDHH38cY8aMQWBgIPz9/XHs2LFue1QmTJggf6/T6aDX61FWVtbp+X5+fkhOTpYfR0VFyefX1taitLQU06dPl59XKpWYMmVKl23Yu3cvPvroI/j7+8tfCxYsgNVqRXZ2tnxeWlqa0+vS0tJw9OhRAMDRo0cRFxfn1Otk/7ewn7Nv3z6cd955XbbF8d9DEARERkZ2+e9BRN1jMS3REHT67J3HHnsM69atw0svvYSUlBT4+vriqquuQktLS5fv4+Pj4/RYEARYrdZenS+KYrtjjk5//nRWqxV33nkn7r///nbPxcfHd/la+2eJotjuc08/7uvr2+V7Ab3/9yCi7rFHhWiQUqvVsFgsPTp369atuPnmm3H55Zdj/PjxiIyMRE5OzsA28DQBAQGIiIjArl275GMWiwUZGRldvm7y5Mk4fPgwUlJS2n2p1Wr5vB07dji9bseOHRg1ahQAqfckLy8P+fn58vNHjhxBbW0tRo8eDUDqLfnpp5/O+DqJqHfYo0I0SCUmJmLnzp3IycmBv78/goODOz03JSUFq1atwiWXXAJBEPDUU0+5pSfgvvvuw/Lly5GSkoJRo0bhzTffRHV1dYe9HXZPPPEEZsyYgXvuuQe33347dDodjh49ivXr1zvN7Pnll1/wwgsv4LLLLsP69evxn//8B2vWrAEAnH/++ZgwYQKWLFmC1157Da2trfjd736HOXPmyMNkTz/9NM477zwkJyfjuuuuQ2trK3744Qc8/vjjA/uPQjTEsUeFaJB69NFHoVQqMWbMGISFhXVZb/Lqq68iKCgIM2fOxCWXXIIFCxZg8uTJLmyt5IknnsD111+Pm266CWlpaXK9iVar7fQ1EyZMwObNm5GZmYlzzjkHkyZNwlNPPYWoqCin8x555BHs3bsXkyZNwnPPPYeXX34ZCxYsACAN0axevRpBQUGYPXs2zj//fAwbNgxffvml/Pq5c+fiP//5D7777jtMnDgR8+bNw86dOwfmH4KIZILY3QAwEZGbWK1WjB49Gtdccw2ee+65Pr9PYmIiHnzwQTz44IP91zgicgkO/RCRx8jNzcWPP/6IOXPmwGQyYcWKFcjOzsYNN9zg7qYRkZtw6IeIPIZCocBHH32EadOm4eyzz8bBgwexYcMGuaCViIYeDv0QERGRx2KPChEREXksBhUiIiLyWAwqRERE5LEYVIiIiMhjMagQERGRx2JQISIiIo/FoEJEREQei0GFiIiIPNb/A985tbxXIzDuAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\"\"\"\n",
    "部分代码参考了GitHub项目d2l-ai/d2l-zh的思路\n",
    "（Copyright (c) 2022 Aston Zhang, Zachary C. Lipton,\n",
    "Mu Li, and Alexander J. Smola, Apache-2.0 License（见附录））\n",
    "\"\"\"\n",
    "# 长短期记忆\n",
    "def gate_params(input_size, hidden_size):\n",
    "    return (nn.Parameter(normal((input_size, hidden_size))),\n",
    "           nn.Parameter(normal((hidden_size, hidden_size))),\n",
    "           nn.Parameter(torch.zeros(hidden_size)))\n",
    "\n",
    "class LSTM(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size):\n",
    "        super(LSTM, self).__init__()\n",
    "        self.input_size = input_size\n",
    "        self.hidden_size = hidden_size\n",
    "        # 输入门参数\n",
    "        self.W_xi, self.W_hi, self.b_i = gate_params(input_size, hidden_size)\n",
    "        # 遗忘门参数\n",
    "        self.W_xf, self.W_hf, self.b_f = gate_params(input_size, hidden_size)\n",
    "        # 输出门参数\n",
    "        self.W_xo, self.W_ho, self.b_o = gate_params(input_size, hidden_size)\n",
    "        # 候选记忆单元参数\n",
    "        self.W_xc, self.W_hc, self.b_c = gate_params(input_size, hidden_size)\n",
    "        \n",
    "    def init_rnn_state(self, batch_size, hidden_size):\n",
    "        return (torch.zeros((batch_size, hidden_size), dtype=torch.float),\n",
    "               torch.zeros((batch_size, hidden_size), dtype=torch.float))\n",
    "    \n",
    "    def forward(self, inputs, states):\n",
    "        seq_len, batch_size, _ = inputs.shape\n",
    "        hidden_state, cell_state = states\n",
    "        hiddens = []\n",
    "        for step in range(seq_len):\n",
    "            I = torch.sigmoid(torch.mm(inputs[step], self.W_xi) \\\n",
    "                + torch.mm(hidden_state, self.W_hi) + self.b_i)\n",
    "            F = torch.sigmoid(torch.mm(inputs[step], self.W_xf) \\\n",
    "                + torch.mm(hidden_state, self.W_hf) + self.b_f)\n",
    "            O = torch.sigmoid(torch.mm(inputs[step], self.W_xo) \\\n",
    "                + torch.mm(hidden_state, self.W_ho) + self.b_o)\n",
    "            C_tilda = torch.tanh(torch.mm(inputs[step], self.W_xc) \\\n",
    "                + torch.mm(hidden_state, self.W_hc) + self.b_c)\n",
    "            cell_state = F * cell_state + I * C_tilda\n",
    "            hidden_state = O * torch.tanh(cell_state)\n",
    "            hiddens.append(hidden_state)\n",
    "        return torch.stack(hiddens, dim=0), (hidden_state, cell_state)\n",
    "    \n",
    "data_loader = DataLoader(torch.tensor(sent_tokens, dtype=torch.long), \n",
    "    batch_size=16, shuffle=True)\n",
    "\n",
    "lstm = LSTM(128, 128)\n",
    "train_rnn_lm(data_loader, lstm, vocab_size, hidden_size=128, epochs=200, \n",
    "    learning_rate=1e-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6a7c49b2",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "epoch-199, loss=0.2488: 100%|█| 200/200 [06:00<00:00,  1.80s\n"
     ]
    },
    {
     "data": {
      "image/png": "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reVniaLY5udefNzFxaXT9wIu/fdBRF1jiwrRAOXk5ASDwdCtc/fs2YM77rgD119/PUaPHo2goCDk5OT0boEXUavVCAwMxOHDh6VjBoMBKSkpnb5u3LhxSEtLQ0xMTJsvJycn6byDBw9ave7gwYMYOXIkAFPrSV5eHvLz86XnT58+DY1Gg1GjRgEwtZb88ssvl32dRHRp2KJCNEBFRkbi0KFDyMnJgbu7O3x8fDo8NyYmBt988w0WLVoEQRDw7LPPytIS8PDDD2PNmjWIiYnByJEj8fbbb6O6urrd1g6Lp556CpMnT8aDDz6Ie+65B25ubkhPT8e2bdusZvbs27cPr776Kq677jps27YNGzduxObNmwEAs2fPRkJCApYvX4433ngDer0eDzzwAGbMmCF1kz333HO4+uqrER0djVtvvRV6vR5btmzBk08+2bu/FKJBji0qRAPUE088AaVSidjYWPj7+3c63uQf//gHvL29MWXKFCxatAjz5s3DuHHj+rBak6eeegq33XYbfvvb3yIpKUkab+Ls7NzhaxISErBr1y5kZmbiyiuvxNixY/Hss88iODjY6rzHH38cycnJGDt2LF566SX8/e9/x7x58wCYumg2bdoEb29vTJ8+HbNnz8bQoUPxxRdfSK+fOXMmNm7ciO+//x5jxozBrFmzcOjQod75RRCRRBC76gAmIpKJ0WjEqFGjcPPNN+Oll17q8ftERkZi1apVWLVqle2KI6I+wa4fIrIbubm5+PnnnzFjxgzodDqsXbsW2dnZWLZsmdylEZFM2PVDRHZDoVDgo48+wsSJEzF16lSkpqZi+/bt0oBWIhp82PVDREREdostKkRERGS3GFSIiIjIbjGoEBERkd1iUCEiIiK7xaBCREREdotBhYiIiOwWgwoRERHZLQYVIiIislv/DzrbdG128V1IAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\"\"\"\n",
    "部分代码参考了GitHub项目d2l-ai/d2l-zh的思路\n",
    "（Copyright (c) 2022 Aston Zhang, Zachary C. Lipton,\n",
    "Mu Li, and Alexander J. Smola, Apache-2.0 License（见附录））\n",
    "\"\"\"\n",
    "# 门控循环单元\n",
    "class GRU(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size):\n",
    "        super(GRU, self).__init__()\n",
    "        self.input_size = input_size\n",
    "        self.hidden_size = hidden_size\n",
    "        # 更新门参数\n",
    "        self.W_xu, self.W_hu, self.b_u = gate_params(input_size, hidden_size)\n",
    "        # 重置门参数\n",
    "        self.W_xr, self.W_hr, self.b_r = gate_params(input_size, hidden_size)\n",
    "        # 候选隐状态参数\n",
    "        self.W_xh, self.W_hh, self.b_h = gate_params(input_size, hidden_size)\n",
    "        \n",
    "    def init_rnn_state(self, batch_size, hidden_size):\n",
    "        return (torch.zeros((batch_size, hidden_size), dtype=torch.float),)\n",
    "    \n",
    "    def forward(self, inputs, states):\n",
    "        seq_len, batch_size, _ = inputs.shape\n",
    "        hidden_state, = states\n",
    "        hiddens = []\n",
    "        for step in range(seq_len):\n",
    "            U = torch.sigmoid(torch.mm(inputs[step], self.W_xu)\\\n",
    "                + torch.mm(hidden_state, self.W_hu) + self.b_u)\n",
    "            R = torch.sigmoid(torch.mm(inputs[step], self.W_xr)\\\n",
    "                + torch.mm(hidden_state, self.W_hr) + self.b_r)\n",
    "            H_tilda = torch.tanh(torch.mm(inputs[step], self.W_xh)\\\n",
    "                + torch.mm(R * hidden_state, self.W_hh) + self.b_h)\n",
    "            hidden_state = (1 - U) * hidden_state + U * H_tilda\n",
    "            hiddens.append(hidden_state)\n",
    "        return torch.stack(hiddens, dim=0), (hidden_state,)\n",
    "    \n",
    "data_loader = DataLoader(torch.tensor(sent_tokens, dtype=torch.long), \n",
    "    batch_size=16, shuffle=True)\n",
    "\n",
    "gru = GRU(128, 128)\n",
    "train_rnn_lm(data_loader, gru, vocab_size, hidden_size=128, epochs=200, \n",
    "    learning_rate=1e-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4473b49e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "epoch-199, loss=0.3717: 100%|█| 200/200 [04:20<00:00,  1.30s\n"
     ]
    },
    {
     "data": {
      "image/png": "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InI6FFROg8lkqp9QWxdQXLcqj60LKlpLRUREpOUUVE6Ta/gn55iOyuDEcAL9zRgGHClSV0VERKQlFFROk6ujkuXuqDhDSWJkIEldggEN/4iIiLSUgsppimvQUSm31VJSVQtAfEQQSV2CAE2oFRERaSkFldOU0GAtFdeE2jCrH6FWvwZBRR0VERGRllBQOU2uHZSzSqrc81Nc81bqh37UUREREWkJBZXT5Oqo5BRXueepuIJKsuaoiIiInBYFldPkmkybW1rFziMlQH146RHtDCr78spwOAzvFCgiItKBKaicpuhQK90ig3AY8Mb3aYBzIi1A//gwAv3NFFXUcCC/zJtlioiIdEgKKqfJYjbx5q1j6VnXPYH6joq/xczI5C4ArEsv9Ep9IiIiHZmCSivoFxfGZ3dP4qJBcYQF+jEuJcr92tiedUEl7ai3yhMREemw/LxdQGcREeTPazePwe4wsJhN7udde/6sO6igIiIicqrUUWllDUMKwMjukZhNkHm00n37soiIiDSPgkobCwv0Z2BCOADr1VURERE5JQoq7cC1k/J6TagVERE5JQoq7WCMa0JtujoqIiIip0JBpR24Oiq7skoorarxcjUiIiIdh4JKO4gLDyQhIhCHAXuyS71djoiISIehoNJO+seHAbAnR0FFRESkuRRU2km/OGdQ2auOioiISLMpqLQTd1DJ0Z4/IiIizaWg0k76u4OKOioiIiLNpaDSTvrEhmIyQUF5NfllNm+XIyIi0iEoqLSToAAL3aOcOyyrqyIiItI8CirtSBNqRURETo2CSjtyzVPZowm1IiIizaKg0o76xoUCkKqhHxERkWZRUGlHDRd9MwzDy9WIiIj4PgWVdtQrJhQ/s4nSqlqyS6q8XY6IiIjPU1BpRwF+ZlJiQgDt+SMiItIcCirtbGi3CADeW5Ph5UpERER8n4JKO7vr/N74mU0s3pnD8r153i5HRETEpymotLM+sWHMmtgTgCf+t4PqWod3CxIREfFhPhNU5s6di8lk4v777/d2KW3uvgv7EhMawIG8cl5evt/b5YiIiPgsnwgq69at49VXX2XYsGHeLqVdhAf686vpAwF4ZvFePtl4yMsViYiI+CavB5WysjJuuukmXnvtNbp06eLtctrN1aO68dOzUwB4+KOtLN2T6+WKREREfI/Xg8rs2bO59NJLufDCC096rM1mo6SkxOOjozKZTPz20oFcMSKRWofBwx9txeHQInAiIiINeTWovP/++2zcuJG5c+c26/i5c+cSERHh/khOTm7jCtuW2Wziz9cMI9DfTF6pjf152gNIRESkIa8FlczMTO677z7effddAgMDm/WeRx99lOLiYvdHZmZmG1fZ9qx+FkYmO4e81qQd9XI1IiIivsVrQWXDhg3k5uYyevRo/Pz88PPzY/ny5fzjH//Az88Pu93e6D1Wq5Xw8HCPj85gbEoUAOvSFVREREQa8vPWN77gggvYtm2bx3O33norAwYM4JFHHsFisXipsvY3rmddUFFHRURExIPXgkpYWBhDhgzxeC4kJITo6OhGz3d2I7tHYjGbOFJcxaHCCpK6BHu7JBEREZ/g9bt+BEKsfgyp2wNIwz8iIiL1vNZRacqyZcu8XYLXjOvZhS2ZRaxNK+TKkUneLkdERMQnqKPiI8bWzVNZm1bA0fJqckuqvFyRiIiI9ymo+AhXUNmfV86oPyxm3J++YcnOHC9XJSIi4l0KKj6iS0gAE3pFezy3MaPQS9WIiIj4Bp+ao3Kme+dn48guruKjDYf4+zep5JXamjzO4TAwm03tXJ2IiEj7U0fFh/hbzCRHBdOtSxAAeWWNg8pjn21n3J++IbdUc1hERKTzU1DxQV3DrABNdlT+tzWL/DIbG9I1LCQiIp2fgooP6hradFApKLNxtLwagMNFle1el4iISHtTUPFBsXUdlYLyauwOw/38vtz63ZWzijX0IyIinZ+Cig+KCgnAZAK7w3B3UAD25dUHlSPqqIiIyBlAQcUH+VnMRIcEAJ7DP6k5CioiInJmUVDxUTGueSoN7vzZ37CjoqEfERE5Ayio+Kim7vxp2FHJK7Vhq7W3e10iIiLtSUHFRx0bVEqrasiu2//Hr26xt5zipheEExER6SwUVHzUsUFlf1454LwjKDkqGNAtyiIi0vkpqPiorsfMUUnNKQWgT2woiZGBgCbUiohI56e9fnxUfUfFOdzjujW5T2woldXOuSlZxQoqIiLSuSmo+KhGQz91i731jQ0lr8y1Oq3u/BERkc5NQcVHxR4TVFLrgkrv2FAC/CoADf2IiEjnp6Dio7qGOuehlFTVUlxRQ+ZRZzjpExtKrd25rL6GfkREpLNTUPFR4UF+BFjMVNsdzN98GIcBCRGBdA21UhJZC8DhwkoMw8BkMnm5WhERkbahu358lMlkcs9T+dfqgwBMGxyPyWRy3/VTXm2npKrWazWKiIi0NQUVHxZTF1RcuyZPHxIPQHCAH5HB/oCGf0REpHNTUPFhrrVUAGJCAxjTM8r9ODEiCNCEWhER6dwUVHyYa+gHYOrgeCzm+rko9Yu+6RZlERHpvBRUfFjDoOIa9nFJjHR2VLSMvoiIdGYKKj7MFVQig/05q1e0x2vJXZz7/WTU3bYsIiLSGen2ZB82uW8MMaFWbj27J/4Wz0zZPdoZVDIVVEREpBNTUPFhPaJDWP/bC5t8rXvdDsoHC5xBxTAM7npvI2W2Wl67eQyB/pZ2q1NERKStaOing3IFleLKGoorasgqrmLR9mxWpObz3JJUL1cnIiLSOhRUOqgQqx8xoQEAZBZWsCen1P3aq9/tZ+uhIi9VJiIi0noUVDqwhsM/qQ2CisOAhz/aSnWtw1uliYiItAoFlQ7MFVQyjlawN8e5eu0tE3sSFRLA7uxSlu/N82Z5IiIip01BpQPrHh0CQMbRcvbWdVTO6hXF2X1iAEjPLwfA4TB44dtUVqbme6dQERGRFlJQ6cBcHZX0/ApS6zoqfePC6HbMYnAbMgr569d7efx/O7xTqIiISAvp9uQOzBVUNmUWUlXjIMDPTI+oYJK6OIPKoULnrcv76zY1LCyv9k6hIiIiLaSOSgfWo27Rt6oa56TZ3l1D8bOY6eYOKs6OysG6ReFKq2q9UKWIiEjLKah0YF1DrVj96i9hv7hQAJKOGfrJqFsUrtruwFZrb+cqRUREWk5BpQMzm03u4R+AfnFhAO6OSmlVLcWVNRw8Wu4+pkxdFRER6UAUVDq4poJKcIAfUSHOxeAOFVa4l9kHDf+IiEjHoqDSwbk2J4T6oR/APaF2x5ESj3BSZlNQERGRjkNBpYNzdVQC/c0kd6kPLa5blH/YX+BxvDoqIiLSkSiodHD964Z7hiRGYDab3M+7gsr3+zwXeSutqmm/4kRERE6T1lHp4Cb0juaZa4czIjnS43nX0E9uqc3jeQ39iIhIR6Kg0sGZTCauGpXU6PluDYaBGtLQj4iIdCQa+umkXB0Vl+AAC9C4o7I/r4yr561i6e7cdqtNRESkuRRUOqluxwSVQQnhQOOOysvL9rPhYCH/WZvRbrWJiIg0l4JKJxUe6E9YYP3I3pBuEYDnZNqqGjtfbs8G4Kj2ARIRER+koNKJJdXNUwkL9HMPBTUc+lm2J5fSuscKKiIi4osUVDox1y3KPaKD3d2VhkM/n20+4v68QEFFRER8kIJKJ+bqovSICiHU6g/U7/VTUlXDNw0m0BZX1lBjd7R/kSIiIiegoNKJTRkQS1igH1MHx9V3VOqGer7ank11rYNeXUMw1a0TV1ihroqIiPgWBZVObHK/rmx9bCozR3Qj1D3045xM+80uZzflihHd6BLs3MBQ81RERMTXKKh0cqa6dkmY1RlUXJNpDxdVAjA4Mdy907KCioiI+BoFlTNEWKBzjkppVS2GYZBTUgVAXHjgcYPK9sPF/PKDzeSXeS7DLyIi0l4UVM4QrqEfu8OgzFbrDh+x4VaijxNU/vLVHj7ddJj3tRiciIh4iYLKGSLY3+KeNHuwoAKHARaziegQq7ujUlBWH1Rq7Q42pB8FIPNoZbvXKyIiAl4OKvPmzWPYsGGEh4cTHh7OhAkTWLRokTdL6rTMZhOhdfNU9uWWAdA11IrFbGpy6GfHkRLKq+0AZBZWtHO1IiIiTl4NKklJSTz11FOsX7+e9evXM2XKFGbOnMmOHTu8WVan5ZpQuz/PGVTiwq0ATQaVtWlH3Z8fKlRHRUREvMPv5Ie0nRkzZng8/uMf/8i8efNYvXo1gwcPbnS8zWbDZquf2FlSUtLmNXYmYYH+UFzl7qjEhgcC9UGloLz+z3ZNg6BypKgSu8PAYja1Y7UiIiI+NEfFbrfz/vvvU15ezoQJE5o8Zu7cuURERLg/kpOT27nKjs01ofbYjkp0iPO/ro6Kw2GwLr0+qNQ6DLLr7hISERFpT14PKtu2bSM0NBSr1cqdd97Jp59+yqBBg5o89tFHH6W4uNj9kZmZ2c7VdmyuOSrp+c45J/HHdFRcQWVPTinFlTUEB1jc+wUdOqp5KiIi0v68OvQD0L9/fzZv3kxRUREff/wxs2bNYvny5U2GFavVitVq9UKVnYNrGf3quj19XEM/0aHOoFJYUYPDYbjnp4zu0QXDcC4Ol1lYyXgv1CwiImc2rweVgIAA+vTpA8CYMWNYt24df//733nllVe8XFnn4woqLnF1QcW1hL7dYVBcWeMOKuNTotwTaQ/pzh8REfECrw/9HMswDI8Js9J6XEM/Lq45KgF+ZneIKSivdk+kHZcSTXJUMNB4LZUtmUW8t+YgDofR1mWLiMgZzKsdlV//+tdMnz6d5ORkSktLef/991m2bBlffvmlN8vqtFzL6LvEhQW6P48OCaC0qpaNBwvJL7MR4GdmWFIEWcVNd1Qe/HALqbll+FvMXDtGk5pFRKRteDWo5OTk8JOf/ISsrCwiIiIYNmwYX375JRdddJE3y+q0GnZUAixmIoPrg0uXkADSCyr4YnsWACOSIwn0t5DUxdlRabiWSlWN3X3n0EtL93HVyG74WXyuOSciIp1Ai367vP322yxcuND9+OGHHyYyMpKJEydy8ODBZn+d119/nfT0dGw2G7m5uSxZskQhpQ2FNpijEhtude+sDLj3+/l+Xz4AZ6VEAZDcxXnXT1ZxJTV1k3BdS/ADpBdU8PnWrDavXUREzkwtCip/+tOfCApy/gL74YcfeOGFF/jLX/5CTEwMv/zlL1u1QGk94Q2CimsirYvrFuUauzOBjEuJBiAm1EqAnxmHAdnFzrVUXN0Ul+e/TcWuuSoiItIGWhRUMjMz3XfqzJ8/n2uuuYY77riDuXPnsmLFilYtUFpPqLV+qMc1kdYlKqT+sZ/ZxKgekYBzj6Ckuq5KZt1aKq6VbacNjiMiyJ/9eeV8tSO7LUsXEZEzVIuCSmhoKAUFBQB8/fXXXHjhhQAEBgZSWal9YXxVw9uTY8M8OyquoR+AoUkRBAfUH3vsPBVXR2V4ciRXj0oCPPcGEhERaS0tmkx70UUXcdtttzFy5Ej27t3LpZdeCsCOHTvo2bNna9YnrSi0GUM/AOPq5qe4uOapuHZRdgWVPl1DCQt03kqujQtFRKQttKij8uKLLzJhwgTy8vL4+OOPiY52zmfYsGEDN9xwQ6sWKK0nzNowqBwz9BNaH1TGHxNUXB2VzKMVOBwG+3PLAegdG0pS3RL7h4sUVEREpPW1qKMSGRnJCy+80Oj5J5544rQLkrbTcB2V+PCmh35MJhjdwzOo9IkNBWBdeiFHiiuprLHjZzbRPSrYPYn2sFauFRGRNtCijsqXX37JypUr3Y9ffPFFRowYwY033khhYWGrFSetK9DfjJ/ZeUty7DFBpV9cGCOSI7lxXHcigjwXhjunbwwhARYOF1Xy8YbDAPSMCcHfYnZvWlhSVUtpVU07nIWIiJxJWhRUHnroIUpKSgDn7scPPPAAl1xyCQcOHGDOnDmtWqC0HpPJxM/P7cXlwxPpFRPi8Vqgv4X5s8/mj1cObfS+QH8LFw6KA+D1lQcA6N3V+f4Qq5974bgjRVVtWb6IiJyBWjT0k5aW5t7d+OOPP+ayyy7jT3/6Exs3buSSSy5p1QKldT00bUCL3nfZsEQ+23yEkqpaAHp3DXW/lhgRRFFFDYeLKugfH9YqdYqIiEALOyoBAQFUVDjnJCxZsoSpU6cCEBUV5e60SOcyuV+Mx+3NrnkrAN3q7go6rDt/RESklbWoozJp0iTmzJnD2Wefzdq1a/nggw8A2Lt3L0lJSa1aoPgGq5+FqYPi+XjjIcCzo+Kap3JId/6IiEgra1FH5YUXXsDPz4+PPvqIefPm0a1bNwAWLVrExRdf3KoFiu+YMTzB/XnvBh2VJHVURESkjbSoo9K9e3c+//zzRs8/++yzp12Q+K5JfWKYOSKRrqFWj52Yu2ktFRERaSMtCioAdrud+fPns2vXLkwmEwMHDmTmzJlYLJbWrE98iJ/FzN+vH9noec1RERGRttKioLJv3z4uueQSDh8+TP/+/TEMg71795KcnMzChQvp3bt3a9cpPszVUckttWGrtWP1U1gVEZHW0aI5Kvfeey+9e/cmMzOTjRs3smnTJjIyMkhJSeHee+9t7RrFx0WFBBDo7/yrlF2stVRERKT1tKijsnz5clavXk1UVP1S69HR0Tz11FOcffbZrVacdAwmk4nEyCAO5JVzuLCSHtEhJ3+TiIhIM7Soo2K1WiktLW30fFlZGQEBAU28Qzo73aIsIiJtoUVB5bLLLuOOO+5gzZo1GIaBYRisXr2aO++8k8svv7y1a5QOQLcoi4hIW2hRUPnHP/5B7969mTBhAoGBgQQGBjJx4kT69OnDc88918olSkegW5RFRKQttGiOSmRkJJ999hn79u1j165dGIbBoEGD6NOnT2vXJx2E6xblQ4UVXq5EREQ6k2YHlZPtirxs2TL3588880yLC5KOyTWB9kBeuZcrERGRzqTZQWXTpk3NOs5kMrW4GOm4+tYtqZ9baqO4ooaIYH8vVyQiIp1Bs4PK0qVL27IO6eDCAv1JjAjkSHEVqbmljOkZdfI3iYiInESLJtOKNKVvXBgAe3PKvFyJiIh0Fgoq0mpcwz97cxqvsSMiItISCirSavrVdVRScxVURESkdSioSKvpG+fqqGjoR0REWoeCirQa1xyVvFIbRRXVXq5GREQ6AwUVaTWhVj/3CrWpueqqiIjI6VNQkVbV5wQTag3D4J8rDrA27Wh7lyUiIh2Ugoq0qn5181RSm5in8v2+Ap5cuIuHPtrS3mWJiEgHpaAirap+LZXGHZXNmYUAHCyooLSqpl3rEhGRjklBRVpV/S3KjTsq2w4Xuz/XnUEiItIcCirSqvrGhmIxm8grtbG9QTAB2Hao/vGebK21IiIiJ6egIq0qxOrHpUMTAJi3fL/7+YIyG0eKq9yP92SXtHttIiLS8SioSKv7xXm9AVi0LYu0/HLAc9gHYLc6KiIi0gwKKtLqBiaEM2VALA4DXqnrqriGfVy3L+/JKcUwDK/VKCIiHYOCirSJu+q6Kh9vPMSRokp3R+XKkd0wm6CooobcUps3SxQRkQ5AQUXaxJieUYxLiaLGbvDYgh3uoDK6Rxd6xoQAmlArIiInp6AibeaJywfjZzaxeGcOWcVVmEwwODGcAfHOW5gVVERE5GQUVKTNDEwIdw8BAaTEhBAW6E//uHBAE2pFROTkFFSkTc2e0oe+dRNoh3aLAKC/q6OSo1uURUTkxBRUpE1Z/Sy8eNMoLhkazx2TewH1QSU1pwy7w3nnT43dwZKdORRVVHutVhER8T0KKtLm+sWF8dJNoxmc6OyodI8Kxupnxlbr4FBhBQCfbjzMbe+s59J/rGRXljotIiLipKAi7c5iNtGtSxAAhwsrgfr5KoeLKrlm3iqW7s71Wn0iIuI7FFTEK7pFOoPKoSJnUHF1ViKD/SmvtnPvfzZph2UREVFQEe9I6hIMwKHCSo///uXqYfTuGkKprZYP1mV6rT4REfENCiriFUnHDP24OiopMSHcfo5z0u0bK9OosTu8U6CIiPgEBRXxCldQOVRYQXFlDSVVtQB06xLEFSO7ERMawJHiKr7YluXNMkVExMsUVMQrXHNUDhdVursp0SEBBAf4EehvYdaEngC8+t0BbV4oInIGU1ARr3DNUckqruJgQUXdc0Hu1398Vg8C/c3sOFLC0j26A0hE5EyloCJeERtmxd9iwu4w2HCwEKgPLwBdQgLcXZW/fLnHvTCciIicWRRUxCvMZhOJdcM/qw8UAJ4dFYBfnNeb8EA/dmeXMn/T4XavUUREvE9BRbzGFUx21q1Ee2xQiQwO4M66TQ2fWbwXW629fQsUERGv82pQmTt3LmPHjiUsLIzY2FiuuOIK9uzZ482SpB25JtS65so2HPpxuXViCnHhVg4XVfK/LboDSETkTOPVoLJ8+XJmz57N6tWrWbx4MbW1tUydOpXy8nJvliXt5NhgcmxHBSAowMJlwxIBtAeQiMgZyM+b3/zLL7/0ePzmm28SGxvLhg0bmDx5speqkvbi6qi4HzcRVAB6xoQAkJ7fdIA1DIP9eWVkF9sY3ysKf4tGNEVEOguvBpVjFRcXAxAVFdXk6zabDZvN5n5cUqJ/YXdkDTsorjVUmpIS7QwqaQWNg8rLy/fzyvL9FFY49wV64vLBzJrYs/WLFRERr/CZf3oahsGcOXOYNGkSQ4YMafKYuXPnEhER4f5ITk5u5yqlNTXsoDQ17OPSM8Y5RJR5tILaBkvqf7b5ME8t2u0OKQBr04+2QaUiIuItPhNU7r77brZu3cp//vOf4x7z6KOPUlxc7P7IzNSmdR1ZfHggFrMJaHoirUtiRBABfmZq7AZHiqoA2JNdyq8+3gbAz8/txT9vHuN+XkREOg+fGPq55557WLBgAd999x1JSUnHPc5qtWK1WtuxMmlLfhYz8eGBHC6qPGFHxWw20SMqmNTcMtIKykmIDOQX722gssbOOX1jeHjaAPJKnUOCafnl2GrtWP0s7XUaIiLShrzaUTEMg7vvvptPPvmEb7/9lpSUFG+WI17gCignCirgOaF2c2YRB/LKiQz25+/Xj8RiNhEXbiUiyB+7w2Bfblmb1y0iIu3Dq0Fl9uzZvPvuu/z73/8mLCyM7OxssrOzqays9GZZ0o7umNyLCwbEMm1I/AmP61UXVNLyy1lTt5Lt2b1jiAoJAMBkMtE/LgxoPPwz94tdjP/TEjKPVrR2+SIi0sa8GlTmzZtHcXEx5513HgkJCe6PDz74wJtlSTu6YGAcr98yltiwwBMe5+6oFJSzJs05YXZciufdYf3jGweV0qoa3lyVTk6JjU82ahl+EZGOxqtzVAxDG81J8/Ssu0V5X24ZR8urgeMHld0NgsrXO3KornXeKfTt7hzuu7Bve5QrIiKtxGfu+hE5kZS6jsqhwkoqqu1EBPm7h3pcBjTRUfnf1iPuz7ccKia3tKodqhURkdaioCIdQly4lSD/+jt5xvaMwlx3a7NLv7qgkl1SRXFFDUfLq1mZmg84b4UGWLY7r50qFhGR1qCgIh2CyWSiR3T9WivjUxqvXhwe6O9eln93dglfbMui1mEwODGcG8Z1B+Cb3TntU7CIiLQKBRXpMFzDPwDjezW9zYJrnsq2w8V8usk5efby4YlcMDAWgBWp+dhq7W1cqYiItBYFFekwXHf+hARYGJQQ3uQxrqDy5MJdbDhYiMkElw5LYHBiOHHhViqq7aw+oGX2RUQ6CgUV6TCGJEYAMLFPDH7H2SF5cGJ9gIkNs/LXa4aT1CUYk8nE+f3ruip7NU9FRKSj8Ikl9EWaY/qQeJ6/YeRxh30ALh4cz0PT+hMXHsjlwxMJ8KsPNEOTInh/XSb78rRyrYhIR6GgIh2G2WxixvDEEx7jZzEz+/w+Tb7WKyYUgAN55a1em4iItA0N/cgZo3dX11osFZpQKyLSQSioyBmja5iVMKsfDgMOFnju+7Ph4FH+77PtVFYrwIiI+BIFFTljmEwmetV1VQ4cM0/lt/N38M4PB/m8wUq2IiLifQoqckbp1dU5T2V/g3kqOSVV7MoqAZxL9IuIiO9QUJEzSq+6tVj2N+ioLG9wu3JWsYKKiIgvUVCRM4qro9Lwzh/PoKJNC0VEfIluT5YzSsM5KoZhYHcYHgvAHSlSR0VExJcoqMgZJSUmBJMJSqpqKSiv5mBBOSVVtVjMJuwOg6ziKgzDwGQynfyLiYhIm9PQj5xRAv0tJEY4d1g+kFfOsj3ObsqUAc7l9Suq7ZRU1nqtPhER8aSgImcc1/DPvtwyvtmVC8C0wfFEhQQAcEQTakVEfIaCipxxetdNqP3zl7vZmVWCv8XE5H4xJEQEArrzR0TElyioyBnH1VEprqzBYjbx1x8NJzYskIS6IaEjRbrzR0TEV2gyrZxxBsSHAxBgMfP8jSOZNjgegMRIdVRERHyNOipyxhnbswtzrxrKh3dOcIcUwN1RyTpOR+WzzYeZ8rdl7MkubZc6RUREQUXOQCaTiRvGdWd4cqTH866OyvEm085btp8DeeW880N6G1coIiIuCioiddwdlSZWpz1SVMnuuk7Ksj15GIbRrrWJiJypFFRE6tTf9VPVKIgs3ZPr/vxwUSV7czx3XxYRkbahoCJSJz4iEJMJqmsdFJRXe7y2dLdzYTjXgrXf7s499u0iItIGFFRE6vhbzHQNtQKeE2pttXa+35cPwHVjkgFY2sygYhgGj36yjSf+t6OVqxUROTMoqIg0kBBZt5ZKcSVHiioprqxhbdpRKmvsxIZZmX1+HwA2ZBRSXFFz0q+3L7eM/6zN4M3v0ykos7Vp7SIinZHWURFpIDEikC2Z8Py3qew8UkKgv4XuUcEAnNe/K8lRwfSLC2VvThnLU/O4fHjiCb/epowi9+fpBeVE13VsRESkedRREWnAdefP9sMlOAznJoWuu33O7+/cuPD8ug0MH/14K/f+ZxMbDh51vz+3pIoXvk2ltMrZbdmUWeh+LS2/ol3OQUSkM1FHRaSBfnHOfYBiQq388cohBFjMvLx8PyYTnNu/K+Ccp7JwaxaHCitZsOUIS/fksv63F2L1s/CnL3Yxf/MRiipq+O1lgzw7Kvnl3jglEZEOTUFFpIGrRycRHxHIyOQuRAT7A/UdFJdeXUP57qHz2XyoiDveWU9+WTXr0ws5q1c0y/Y67w5atD2b+y7sy56c+lVs0xRUREROmYZ+RBrwt5g5r3+sO6Qcj9lsYlT3Lu7hoKW7c9lyqIiiugm2h4sq+feaDBoux6KgIiJy6hRURE6Dq9uydE8uy/fkebz24tJ9AAxMcG6CmF5QrhVtRUROkYKKyGmY1DcGi9nE/rxyPtpwyPlcnxgASqpqAZg5IhGzyTkxN69UtyiLiJwKBRWR0xAe6M+YHl0A53APwOOXDyLAUv+jNS4liqQuzlucNfwjInJqFFRETlPDybYD4sPoExvGpL7OrkqAxczgxHB6xoQAzuEfERFpPgUVkdPkmlALcF7d59OHxAMwIjkSq5+FlGhnR+WAOioiIqdEtyeLnKZ+caH0iA7mYEEFFw1yBpWrRyVRYzcYlxIFUN9RUVARETklCioip8lkMvH6rDEcLKhgdA9nMDGbTdw4vrv7mPqgUkFxZQ2Ld+YwZUAsUSEBXqlZRKSjUFARaQV9Yp1zU44nJbp+jsp1r/zA7uxSkroE8fqssfSPP/77RETOdJqjItIOkroE4Wc2Yat1uPcOOlRYyVUvfc/3+/K9XJ2IiO9SUBFpB34Ws3sX5m6RQcyffTZn9YqivNrO/3223cvViYj4LgUVkXZy95Q+XDQojg9+fhYjkiOZd9NoAPbnlVNUUe3l6kREfJOCikg7uWpUEq/dPMa9+FuXkABS6ibZbs4s8mJlIiK+S0FFxItGJEcC9UGlstpOaoMdl0VEznQKKiJeNLJ7JACbMooAePCjLVz07Hc8vmAHdoc2MBQRUVAR8aKGHZW8Uhtfbs8G4K1V6fzi3Q1UVtu9WJ2IiPcpqIh40YD4cAL8zBRX1vCPb1KxOwwSIgIJsJj5emcOTy7c6T7WMAwMQ10WETmzKKiIeFGAn5mh3SIAeG/NQQB+cV5vXrnZeUfQh+sPkVtaRa3dwa1vrWPK35azP68MgKKKav654gCZRyu8U7yISDtQUBHxMtfwj8MAf4uJy4Ylcn7/WEZ1j6Ta7uDtVen8a/VBlu3JIy2/nJtfX8vGjEKuefkHnly4i1veXEuN3eHdkxARaSMKKiJe5ppQC86dmF37/9wxuTcA//rhIH/7ei8AYVY/DhdVctVLq9iX6+ys7M8r5+1V6e1as4hIe1FQEfEyV0cFnGutuFw0KI5eMSGUVNVSZqtleHIkn987ia5hVsC5a/Oci/oB8NySVHJLq9q1bhGR9qCgIuJl3SKDmD4kngm9ojl/QFf38xazidvO6QWA2QR/vGIIPaJD+PjOiTw2YxAf3jmRu8/vw7CkCMpstTz95Z7jfg/DMHjh21TeWJnW5ucjItKaTEYHvo2gpKSEiIgIiouLCQ8P93Y5Iq3OVmvnTwt3MSAhnBvGdW/ymPXpR7nm5R/wt5jY9vg0Av0tjY7Zm1PK1Ge/A2D1oxcQHxHYpnWLiJzIqfz+VkdFxIdZ/Sw8MXPIcUMKwOgeXYgJDaDGbrDjSEmTx6xIrd+heaV2axaRDsSrQeW7775jxowZJCYmYjKZmD9/vjfLEemQTCYTI5K7ALApo7DJY1am5rk/X1H3+aaMQq6et4ot2mdIRHyYV4NKeXk5w4cP54UXXvBmGSId3rFL8TdUXetgTdpR9+Pv9+XjcBj86YtdbDhYyBvfa96KiPguP29+8+nTpzN9+vRmH2+z2bDZbO7HJSVNt7lFzjT1QcXZUdmSWcSrKw7wwEX9yC21UVFtJzokgMoaO/ll1Xy66TDr0p3HrmsQYkREfE2HmqMyd+5cIiIi3B/JycneLknEJwxPisRsgiPFVWQXV/F/C3awcGsWd/97E0v35AIwqW8ME3pFA/D4gh3u9x4pruJQoVa3FRHf1KGCyqOPPkpxcbH7IzMz09slifiEEKsf/eOdM+ffWpXunneyM6uE11c4h3Ym9YlhUt8YAEpttQCEBzqbquvS1VUREd/UoYKK1WolPDzc40NEnFzDP6+tOABAj+hgAGodzhUIzunblXP61q/T0jc2lOvGOruSa9OanoQrIuJtHSqoiMjxjaxb4dZeF0yeu24EFw2KA6BPbCjxEYH07hpCYt0aKj+Z0IOxPaMAdVRExHd5dTKtiLSekd27uD8fnhTByO5deOqqoUQE+XPZsATAeSvzU1cPY9X+Aq4bm0yFzQ7AvtwyjpZXu/cZEhHxFV4NKmVlZezbt8/9OC0tjc2bNxMVFUX37sdf4EpEGusVE0JksD9FFTXcPKEnANGhVv76o+Eex03u15XJ/ZxDQFY/C31jQ0nNLWNd+lGmDY5v77JFRE7Iq0Fl/fr1nH/++e7Hc+bMAWDWrFm89dZbXqpKpGMym03MvXIo2w4Xc/mIxGa/b2xKFKm5ZXy4/hB5pTZiQq2c0zeGEKsariLifdrrR+QMN3/TYe7/YLPHc1Y/MxcOiuOPVwwhMljDQSLSurTXj4g027TB8Vw5shvn9I1h6qA4ukcFY6t1sHBrFr/6eBsn+7fMocIKZr+3kVX7tYeQiLQ+9XZFznBBARaevW6E+7FhGPxwoIBZb6zlyx3ZfLLxMFePTjru+387fzvL9uRxpLiST++KaYeKReRMoo6KiHgwmUxM7B3D/Rf2A+CxBTvIPNr0yrVL9+SybI9zk8MtmUUUllcD8J+1Gfx2/jZq7A73sav251NUUe1+nFVcyQ/7C9rqNESkk1BQEZEm3Xlub0b36EKZrZa/fr2n0es1dgdPfr7T/dhhwIp9+RSWV/PYZzt4d3UGS3c7l+//cns2N762hl/WzYUxDIOfvrWeG15bzcbj7PgsIgIKKiJyHBazicdmDAJg0bZsjpZXe7z+6ncH2J9XTnRIADeMcy4nsGxPLp9tPkx1XSfFtc/Q/7Yccb6+N4/ckip2ZpWwK8u5qai6KiJyIgoqInJcw5IiGdItnGq7g483HHI//8ry/Tz9lbPL8uC0/swY7lxQ7ru9eXywvv64b3fnUlVjZ1ldYDEMWLDlCAs2H3Ef49qXCKC4oob0/HIOFpRjq7W35amJSAehybQickI3juvBrz/dxn/WZvCzSSk8s3gvLyx1LtQ4+/zeXD82mRq7QUiAhfyyavLLqgmwmLGYTeSU2Hjj+zTKq+tDx/zNhykoq+/ObM4swjAMUnPLuOwfK93dmKQuQXzzwLlY/Szte8Ii4lPUURGRE7p8RCIhARYO5Jdzzcur3CHloWn9eWjaAEwmEwF+Zib2qb/j56JBce6dmp//xnn8xYPjsZhNbD9cQlZxFaFWPyxmE7mlNrJLqpi/yTlk5G8xYTLBocJKNqRr/orImU5BRUROKNTqx8yR3QDYmFGEv8XEn68eyuzz+3gcd17/+p2ZfzQmiSkDYgGorHF2U64fl8w5fevDzPQh8fSPCwOcwz9LduUA8PQ1w7my7vt9l6q1WUTOdAoqInJSPzmrBxaziaiQAN677SyuG9t4L64LB8YREmChV9cQzunblfP7x7pfC7X6MaF3NDMbLO0/c0Q3htft+LxgyxH25pRhMZs4v38sk/s6Q8/KfXlte2Ii4vM0R0VETmpgQjhf3X8O0SFWuhxnh+W48ECWPHAugX4WLGYT8RGBDEoIZ2dWCef264rVz8LUQfEkddnrDi6Hiyr4z1r4Yls2AONToogI9ufsumGk7YdLKCizER1qbbdzFRHfoo6KiDRLn9iw44YUl4SIII9jfjYphchgf2ZN7AlAiNWPbx84j//dMwmL2cSI5C4e779wYBwAXcOsDExw7v+xcp+Gf0TOZAoqItJmrh6dxOb/m8q4lCj3cwF+Zvwtzv/19IkNJTig/q6eiwbFuT+fXDefZUUbz1MpqqgmNae0Tb+HiLScgoqIeI3FbGJotwgABsSHkRwV7H7tnLp5KitS8064MaJhGOSX2Vpcw8/eXs+0577TwnMiPkpBRUS86ty6u4Vmjujm8fyYnl2w+pnJKbHxf5/t4POtR1i4NYv/rs9kX24ZAJXVdm55cx1jnlzCbW+vZ092052RpXtyeeJ/Oxqtrrs/r4wNBwtxGPC3r/ecdKdoEWl/mkwrIl51+zm9GNczilHdPeerBPpbOLdfV77emcO/Vh/kX6sPul+zmE38bFIKmzOKWJt+FIAlu3L4ZncOv7p4AD8/tzcABWU2nvjfThbULeFfY3fw5BVD3V9n4dYs9+frDxbyXWo+5/arv81aRLzPZHTgf0KUlJQQERFBcXEx4eHh3i5HRFpZRXUti3fmsC79KDuOlOBvMVNrd7Axo8h9TJjVjyevHMKX27NZtN1599BrN4+hZ3QwN7+xlqziKvexoVY/1vz6AkKszn+jTX12OXtzyugZHUx6QQXDkyKYP/tsTCZTu56nyJnmVH5/K6iISIfz7e4cHluwg6oaB2/MGsvQJOc8l//7bDvv/HDQveptcWUNvbqG8Oy1I7jv/U2kF1Tw56uHct3Y7uzNKWXqs9/hbzHx1f2TufQfK6mssfPsdcO5cmSSx/ebt2w/n289wj9uGEnvrqHeOGWRTuVUfn9rjoqIdDhTBsTx3UPn8/0jU9whBeB3lw1iXEoUZbZaiitrGNk9ko/vnMjw5Ej3Ds//XpMBwOd1wz6T+3alV9dQfjYpBYAHP9zKp5vqN1bceaSEp7/azY4jJcx+byNVNdosUaQ9KaiISIfk2mOoIX+LmZduGsX4lCiuHNmN924b717X5erRSfhbTGw5VMz7azPcYeSyup2f77+wL1ePSsLuMPjlB1t4efl+7A6D//tsO466vvPu7FKe+N/O9jtJEdHQj4icOe7+90Z3JwUg0N/Mut9cSFigPwAOh8HvP9/JW6vSAec6L/tyywjyt/DEzME88vFWDAPuPLc3d53fm/C694nIqTmV39+660dEzhg/n9ybb3blEhHkz8Q+0VwzKskdUgDMZhOPzRhEn9hQnly4030b9L0X9OXaMckcKqzkH9+k8vLy/fxnbQbn9I0hLNCfs3pFcfnwxJNOwjUMg7xSG13DrJqwK9JM6qiIyBnF4TAwmThpUNiXW8b/fbadQH8LL/94NAF+ZgzD4Ksd2fz1673uEOPy/A0jmTE88ThfzenxBTt4a1U643pGcf+FfZnQO9orgaXMVsuWzCImeun7i+iuHxGRNmR3GHyzK4dDhZVszCjk861ZRAb78/UvJxMbFtjke9YcKOC6V1d7PHfXeb15+OIBHs+tTM3n6a/38MTlgxlRt7v0yRiGwS8/2ExhRQ2v3jwaq59zW4IyWy0hAZZGYeSB/27h442H+NX0AdxZt+ZMZ5dTUsVzS1L56dk96RsX5u1yzni660dEpA1ZzCamDo7np5NSeObaEQxKCKeoooZff7K9ydVtbbV2Hv10GwCXD0/k5gk9AHj1uwNkFFS4j6uqsfPwR1vYklnE4wt2NHul3GV78pi/+QjL9+axYLNzcbuFW7MY+vhXvLRsv8exFdW1fLHNOU9n3rL9lFTVnPofQAf050W7+c/aDJ77JtXbpcgpUlARETkNAX5mnrluOP4WE0t25fDcktRGAePlZQc4kFdOTKiVP8wcwu9nDuGcvjHUOgye+2av+7jXV6ZxpG6Bus2ZRc3aOdowDJ7/tv6X7z9XpFFVY+ePC3diGPDPFQew1dbfUv3Nrlwq626xLq6s4Y2Vaad1/idTY3ewcGsWRRXVJz+4jeSX2dyTqLdkFnmtDmkZBRURkdM0ID6cX18yEIC/f5PKU4t2u8NKcWUNLy93djUemzGIiGDn5N0Hp/YHYP6mw6TmlJJXauOlpfsA6F83NPH8t/uwOww+23yYuYt28fiCHTyzeK9H8PjhQAEbM4oI8DMTEmBhT04ps9/b6A48hRU1fL0jx338/+q2ExiU4Gy3v74i7aQh4lBhRYvXj5m3bD+z/72RK178nsyjFSd/Qxv4z5oMqu0OAA4VVjba80l8m4KKiEgruPXsFH532SAAXvnuAM9/6wwdH284RGWNnX5xoVw2LMF9/PDkSKYOisNhwK1vrePqeasor7YzPCmCN28dS4DFzNq0o1z0zHLue38zryw/wFur0vnHN6m89t0B99d5oe77XD82mevGOhe1+2Z3LuDckRrgP2udi9yVVNWwbE8eAH/90XAGJoRTaqvl1QZf71jf78tn8l+Wcve/N53yn4mt1s47P6QDkF5QwdXzVrE7u+SUv05z5ZZWccc763m/7nzB2dF5d41znyjXVJ2th4rarAZpfQoqIiKt5GeTUvjDzMEAvLB0HwcLynm3bjPFn5zVo/Gk1qn9sZhNHCqsJONoBWaTc3XdxMggrhnjXMb/QH45YYF+zJrQg2tGO5+bt2w/eaU2vtyexar9BfiZTfz83N7cenZPzHXfok9sKK/dPAaTCVbtLyA9v5yvd+RQbXfQJzaUgQlhzLmoHwBvfp9OfpmtyXN6bsleHIZz08dNGYXHPfeqGjs5JVUcLqp0d3z+tyWL/LJq4sMD6R8XRm6pjR//cy15pU1/r9NRVWPn9nc28PXOHJ5cuIuK6loAvtqRTU6JjZhQK9OHxAOw7VBxq3//jqqiupbHPtvO51uPeLuU49I6KiIirejHZ/Xgyx3ZfL+vgFvfXMeB/HJCrX5cOSqp0bH948P4+BcTOVjgDCPdo4LpE+vsgtx/QV8yCiro1TWE+y7oS3SoFYfDIDWnlC2Hinnooy2sOeDcOfqnk1LoFhkEwLVjkvnv+kx+c8lAkqOCObdfV5btyeORj7eSU+IcDpoxzLnmy4UDYxmeFMGWQ8XMW7bf3RFyWZt2lHXp9eHkxaX7+OessY3OY3d2CVe/5OwIAUSHBDDvx6N583vn/JebJ/bgpnE9+NErq9ibU8ac/27m7VvHYTa3zq3RhmHw4Idb3PNPymy1LNqWzVWjuvHPFc4abhyXTHiQP19sy2bLKQQVwzCw1ToI9Le0Sq0tVVFdS7nNTtcwa6t+3b98uYe3fzjIou3ZXDbsxLfXe4s6KiIirchkMvHYjMFYzCYO5JcDcNWoboRam/534YjkSGaO6MaUAXHukAIQGx7Iu7eN5/czhxAd6vzlZDab3HNhlu3Jo7LGzjl9Y3h4Wn/3+568Yghrfn0h5w+IBXDvcbQm7SjpBRVYzCYuH5HorvWBurky764+SHaDnabBGUwAJvfritkES3blsuOI5y95h8Pg159so7zajsnkvCOqoLyaG15bzY4jJQT6m7lhbHcigv154cZRBPqbWZGaz8vfed6NdDreXZPB51uz8LeYmDooDoD/rs9k2d48NmcWEehv5scTejC87nbv5g79rEjNY8rfljP2j0tYc6Cg2fVUVNfy5Oc7Wb4371RPpUm2WjtXvbSKyX9Z2qrzfFYfKHCvwpxbaqPQR+fuKKiIiLSyfnFh/OSsHu7HDT8/XeN7Rbt/GfeKCeGFG0bhZ6n/X7mfxezxr+6LBsZx3wV9uXlCDx6fMYjPZp9NSkyI+/Vz+sYwtmcXbLUOdzAB2H64mOV78zCb4MmZQ9z/2n5q0W6PQPPB+kw2ZhQREmBh1a+msP3xaUwfEo+9boOkK0d2c++31C8ujCcudw6N/e3rve5bs3ccKWbSn7/lF+9uYG9O6Sn9eRiGwb/q5sE8PG0AT8wcjNnkDGZPLNgBwM0TehIbFsjgxHDMJucvZVd3qSkOh8EjH23lJ6+vJS2/nNKqWm59ax0bDh5tVk0vfLuPf65M46EPt+BwnPwW87T88hMOq726/AC7s0uprLGzcFvWcY87FeW2Wh76aIvHc3tO8c++vSioiIi0gV9e2I9xKVHMmtCj1RcY+9NVQ7n3gr7867bx7ruIjsdsNvHLi/rx+5lDuOXsFIZ0i/B4vWFX5d9rM9h6qAi7w+D3dZsvzhieSPfoYGaf3weTCVak5jPhqW+4Zt4qfjd/O08t2g3AnKn9SYgIIijAwos3juLeC/oyODGcX5zbx+P7XTsmmUl9YrA7DN5b65y/89ySVA4VVrJoezbTnvuO383fTm3dXTpNMQzDHYS2Hipmb04ZVj8z141LJiEiiMn9ugLOCbzBARZ+PrkXAMEBfvSt61ptPFjI3EW7ePDDLY3uaFq2N5cP1mdiNsEtE3tydp9oKqrtzHpjXZOTgWvsDoornevRHCqs4J91t3znltrYlHn8AALOYaorX/qeK19axR8+39novDMKKnihQYD8akf2Cb9eQ0t353LTP1fzXt1kYhdbrZ17/rOJzKOVJEYEclavKAD2ZHsGFcMwTngd2ouCiohIG4gI9ue/P5/AEzOHtPrXjgm1Mueifu55KafrrF7RXDYsAbvDYM5/t/D8t6msTT9KSICFBy5yhpj+8WG8+pMxjO3ZBcOA9QcL+dfqgxRX1jAoIZxZE+q7RmaziTkX9WPhvefQPTrY43uZTCb3gncfrj/EvtxSluxy3j59Xv+uGAb8a/VB7npvY5O3RH+/L59Jf17KjOdXUlxZw4cbMgG4eEi8e5PIa8cku4+/eUJP99AZwLAkZ1B7+OOtvLL8AB9tOMTcL3Z5fI9/r3F+zVsmpvD45YP5581jGZcSRZmtlj8u9DzWMAx+9vZ6Rv7+a+Yu2sXcRbuprq3/5b5o24mDxUfrMymqcIac11emcetb61ibdhS7w+BAXhmPfroVW63DXfemjCJ3Nyg1p5TK6sZ/RrklVdz29jpufWsd3+8r4In/7SSruBJwhpQ7/7WBb3fnEuhv5rnrRzK6RxfAuTt4Q+vSCzlr7jc88/WeE55DW1NQERER/jBzCDGhVvbllvHcEucCco/NGOwRNC4aFMeHd05k5SPn8/Q1w/jFeb25elQS/7hhpMfw08lMGRBLQkQgR8urueNfGzAM5xDUW7eO47WbxxDgZ+brnTn85PU1fLEti9zSKjYcPMofPt/Jj19fw+GiSnZmlTDng83ulXh/NLo+nFwwMJYe0cF0DbNyR103xWVY3TyV0qpaAupqfvuHgyytu6U7u7iKb3c7g9ON451fMyjAwt9+NBw/s4kVqfmsTasfAvpiWzbf7c3DYcAryw+wcGsWJhPcfb6zk7Roe7bHAoBltlrmbzpMYXk1DofB2z84ux2XDksgyN/CitR8rn3lBwY/9iVT/rac7/cV4G8x8ex1IxjV3Vn71zuyeW/NQS569jt+XbficcOvf/Mba1myKxc/s4mEiECq64b17A6De/69iaV78gj0N/PGLGcA61fX8Tt22O3TTYfIL6sm+wTDZO1Bd/2IiAhdQgJ46qqh3PbOegCmDorjR2Ma36kEkNQlmB+NCW7ytebws5i5YVx3nlm8lwN5zgnHPz07BXCGobduHcvtb69nXXqhx11HLpcNS+DrHTnu9WISIwKZ2Dva/brVz8IX956D3TDcXRaXcT2dwxwhARZemzWGxTtzePP7dB76aAuf3nU2n246jMNwHtdwcnNyVDDXjk3m32sy+OvXe/jgjrOw1Tp46ktnh+XiwfGsP1hIfpmNq0YmMfv8Pry+Mo3DRZVsP1zC0KQIckqqmPXGWnZnl9IrJoQ7JvciLb+c8EA//nL1MDILK3h1+QG+2Z1LcWUN/hYT41Oi+dk5KfTuGsq0wfFszCjiX6sPcrBufs/XO7KprnUQ4GfG7jC4//1N7M4uJSbUyr9vH09heTXXvbqaD9ZlUm6z8/XOHAL8nCFlYp8YwLlgIcDe7FIMw8BkMlFVY3ev5nvlyKb/HrQXBRUREQHgwkHOibcbMwqZe9XQNt1Z+fqxyfzjm1RqHQa9YkI4t25eCcDE3jF8dvckPliXwZJduaTll9M1zMqQxHBuHN+DiwbF8e7qg/x2/nYArh6d1OhW55Dj3GXVPz6M924bT7fIIHrGhDCqexdW7StgT04pl/x9Bf5+zi7LjeO7N3rvPVP68NGGQ6xNO8rbq9LJKq4i82glceFWnrluOLYaB6v2F3DBwFgC/S2c178ri7Zns3BbFqW2Gh76cCuHi5xDMAfyy/nVJ85uyPXjuhNi9WNAfDjPXDeCGruD1JwykqOCCGsQtKYNjmfuot3szanfubu82s7GjELO6hXNM4v3sGRXLgF+Zl67ebS7UzKpTwwr9+Xz6abDAPztR8PdIQUgJSYEf4uJUlsth4sqSeoSzDe7cimtqqVbZBDjU6KaeVXbhoKKiIi4/bJuEbi2FhseyGXDEpi/+Qi3ndOrUdDoExvKby4dxG8uHUS5rbZR8LhpfHcO5JWzfG8uN40/tbuqzm7wSzrQ38Ibt47lnn9vZGNGEdggIsifi+sWh2soISKIG8d1561V6TxeN9kYnHcbBQf4ERzgHMJxuXhIPIu2Z/Py8v3ubRR6xYTw5BVDeOgjZ2gxm3DP2XHxt5gZlNh4R+GeMSEMiA9jd3YpUSEBDE4MZ0VqPt/tzWNgQjiv103iffqaYYzs3sX9vjlT+7n3jXpwaj9mDPdcLyXAz0yvmFD25JSyN6eUpC7BfLLxEABXjExstfVuWkpBRUREvOJPVw3lxvE9GNuzywmPa6o7YjKZ+L8Zg4BBjd9wirpFBvHfn0/ghaX7+OeKNO6Z0ue4C7zdf2FfCiuqSc8vJ7+smhHJkVw5sluTx04ZEEuY1Y9SWy3hgX5cPCSeX00fSFRIAO/fcRYP/HcLZ/WKIqlL84fR7pjci6e/2sNTVw8jv9TmDCqpecRHBFJV46B/XBiXHxNERnXvwh9mDsZW6+Bnk1Ka/Lr948PYk1PK7uxShiVFsqxuDRhvD/sAmIzm7iPug0pKSoiIiKC4uJjw8MbpU0RE5FS45mi0ln25peSW2hjTI4oAv9a9fyW3tIpxf/wGgO5RwWQcreCxGYO49eymw8iJvLh0H09/tYcrRiQypFsETy7cxfCkCD67e1Kr1uxyKr+/1VERERGp09rzcvrEhnlMym1NsWGBDEoIZ2dWCRlHK7D6mY/b3TkZ147d3+7OdU+ivXq097spoNuTRUREOqzJDSYhXzo0gcjggBZ9nf51O22XVNVS6zC4fHgi149tPKHYGxRUREREOqjJ/eonBt/QxJ1KzZXUJYi4cOfCeA9N68/frx/R6kNVLaWhHxERkQ5qbM8oJvfrSligH2N6nHhS8omYTCY+/PlESm01DE6MOPkb2pGCioiISAflbzHzzk/HtcrXOna7A1/hG30dERERkSYoqIiIiIjPUlARERERn6WgIiIiIj5LQUVERER8loKKiIiI+CwFFREREfFZCioiIiLisxRURERExGcpqIiIiIjP8npQeemll0hJSSEwMJDRo0ezYsUKb5ckIiIiPsKrQeWDDz7g/vvv5ze/+Q2bNm3inHPOYfr06WRkZHizLBEREfERJsMwDG998/HjxzNq1CjmzZvnfm7gwIFcccUVzJ0796TvLykpISIiguLiYsLDw9uyVBEREWklp/L722sdlerqajZs2MDUqVM9np86dSqrVq1q8j02m42SkhKPDxEREem8/Lz1jfPz87Hb7cTFxXk8HxcXR3Z2dpPvmTt3Lk888USj5xVYREREOg7X7+3mDOp4Lai4mEwmj8eGYTR6zuXRRx9lzpw57seHDx9m0KBBJCcnt2mNIiIi0vpKS0uJiIg44TFeCyoxMTFYLJZG3ZPc3NxGXRYXq9WK1Wp1Pw4NDSUzM5OwsLDjhpuWKikpITk5mczMzE45/6Wznx/oHDuDzn5+oHPsDDr7+UHrn6NhGJSWlpKYmHjSY70WVAICAhg9ejSLFy/myiuvdD+/ePFiZs6c2ayvYTabSUpKaqsSAQgPD++0f/Gg858f6Bw7g85+fqBz7Aw6+/lB657jyTopLl4d+pkzZw4/+clPGDNmDBMmTODVV18lIyODO++805tliYiIiI/walC57rrrKCgo4Pe//z1ZWVkMGTKEL774gh49enizLBEREfERXp9Me9ddd3HXXXd5u4xGrFYrjz32mMecmM6ks58f6Bw7g85+fqBz7Aw6+/mBd8/Rqwu+iYiIiJyI1/f6ERERETkeBRURERHxWQoqIiIi4rMUVERERMRnKag04aWXXiIlJYXAwEBGjx7NihUrvF1Si8ydO5exY8cSFhZGbGwsV1xxBXv27PE45pZbbsFkMnl8nHXWWV6q+NQ9/vjjjeqPj493v24YBo8//jiJiYkEBQVx3nnnsWPHDi9WfOp69uzZ6BxNJhOzZ88GOuY1/O6775gxYwaJiYmYTCbmz5/v8XpzrpvNZuOee+4hJiaGkJAQLr/8cg4dOtSOZ3F8Jzq/mpoaHnnkEYYOHUpISAiJiYncfPPNHDlyxONrnHfeeY2u6/XXX9/OZ3J8J7uGzfl72VGvIdDkz6TJZOLpp592H+Pr17A5vyN84WdRQeUYH3zwAffffz+/+c1v2LRpE+eccw7Tp08nIyPD26WdsuXLlzN79mxWr17N4sWLqa2tZerUqZSXl3scd/HFF5OVleX++OKLL7xUccsMHjzYo/5t27a5X/vLX/7CM888wwsvvMC6deuIj4/noosuorS01IsVn5p169Z5nN/ixYsB+NGPfuQ+pqNdw/LycoYPH84LL7zQ5OvNuW73338/n376Ke+//z4rV66krKyMyy67DLvd3l6ncVwnOr+Kigo2btzI7373OzZu3Mgnn3zC3r17ufzyyxsde/vtt3tc11deeaU9ym+Wk11DOPnfy456DQGP88rKyuKNN97AZDJx9dVXexzny9ewOb8jfOJn0RAP48aNM+68806P5wYMGGD86le/8lJFrSc3N9cAjOXLl7ufmzVrljFz5kzvFXWaHnvsMWP48OFNvuZwOIz4+Hjjqaeecj9XVVVlREREGC+//HI7Vdj67rvvPqN3796Gw+EwDKPjX0PA+PTTT92Pm3PdioqKDH9/f+P99993H3P48GHDbDYbX375ZbvV3hzHnl9T1q5dawDGwYMH3c+de+65xn333de2xbWSps7xZH8vO9s1nDlzpjFlyhSP5zrSNTSMxr8jfOVnUR2VBqqrq9mwYQNTp071eH7q1KmsWrXKS1W1nuLiYgCioqI8nl+2bBmxsbH069eP22+/ndzcXG+U12KpqakkJiaSkpLC9ddfz4EDBwBIS0sjOzvb43parVbOPffcDns9q6ureffdd/npT3/qsRFnR7+GDTXnum3YsIGamhqPYxITExkyZEiHvLbFxcWYTCYiIyM9nn/vvfeIiYlh8ODBPPjggx2qEwgn/nvZma5hTk4OCxcu5Gc/+1mj1zrSNTz2d4Sv/Cx6fWVaX5Kfn4/dbm+0e3NcXFyjXZ47GsMwmDNnDpMmTWLIkCHu56dPn86PfvQjevToQVpaGr/73e+YMmUKGzZs6BCrLI4fP5533nmHfv36kZOTw5NPPsnEiRPZsWOH+5o1dT0PHjzojXJP2/z58ykqKuKWW25xP9fRr+GxmnPdsrOzCQgIoEuXLo2O6Wg/q1VVVfzqV7/ixhtv9Njs7aabbiIlJYX4+Hi2b9/Oo48+ypYtW9xDf77uZH8vO9M1fPvttwkLC+Oqq67yeL4jXcOmfkf4ys+igkoTGv5LFZwX8NjnOpq7776brVu3snLlSo/nr7vuOvfnQ4YMYcyYMfTo0YOFCxc2+qHzRdOnT3d/PnToUCZMmEDv3r15++233RP3OtP1fP3115k+fbrH1ugd/RoeT0uuW0e7tjU1NVx//fU4HA5eeuklj9duv/129+dDhgyhb9++jBkzho0bNzJq1Kj2LvWUtfTvZUe7hgBvvPEGN910E4GBgR7Pd6RreLzfEeD9n0UN/TQQExODxWJplAJzc3MbJcqO5J577mHBggUsXbqUpKSkEx6bkJBAjx49SE1NbafqWldISAhDhw4lNTXVffdPZ7meBw8eZMmSJdx2220nPK6jX8PmXLf4+Hiqq6spLCw87jG+rqamhmuvvZa0tDQWL17s0U1pyqhRo/D39++w1/XYv5ed4RoCrFixgj179pz05xJ89xoe73eEr/wsKqg0EBAQwOjRoxu15RYvXszEiRO9VFXLGYbB3XffzSeffMK3335LSkrKSd9TUFBAZmYmCQkJ7VBh67PZbOzatYuEhAR3y7Xh9ayurmb58uUd8nq++eabxMbGcumll57wuI5+DZtz3UaPHo2/v7/HMVlZWWzfvr1DXFtXSElNTWXJkiVER0ef9D07duygpqamw17XY/9edvRr6PL6668zevRohg8fftJjfe0anux3hM/8LLbKlNxO5P333zf8/f2N119/3di5c6dx//33GyEhIUZ6erq3Sztlv/jFL4yIiAhj2bJlRlZWlvujoqLCMAzDKC0tNR544AFj1apVRlpamrF06VJjwoQJRrdu3YySkhIvV988DzzwgLFs2TLjwIEDxurVq43LLrvMCAsLc1+vp556yoiIiDA++eQTY9u2bcYNN9xgJCQkdJjzc7Hb7Ub37t2NRx55xOP5jnoNS0tLjU2bNhmbNm0yAOOZZ54xNm3a5L7rpTnX7c477zSSkpKMJUuWGBs3bjSmTJliDB8+3KitrfXWabmd6PxqamqMyy+/3EhKSjI2b97s8bNps9kMwzCMffv2GU888YSxbt06Iy0tzVi4cKExYMAAY+TIkT5xfoZx4nNs7t/LjnoNXYqLi43g4GBj3rx5jd7fEa7hyX5HGIZv/CwqqDThxRdfNHr06GEEBAQYo0aN8ridtyMBmvx48803DcMwjIqKCmPq1KlG165dDX9/f6N79+7GrFmzjIyMDO8Wfgquu+46IyEhwfD39zcSExONq666ytixY4f7dYfDYTz22GNGfHy8YbVajcmTJxvbtm3zYsUt89VXXxmAsWfPHo/nO+o1XLp0aZN/N2fNmmUYRvOuW2VlpXH33XcbUVFRRlBQkHHZZZf5zHmf6PzS0tKO+7O5dOlSwzAMIyMjw5g8ebIRFRVlBAQEGL179zbuvfdeo6CgwLsn1sCJzrG5fy876jV0eeWVV4ygoCCjqKio0fs7wjU82e8Iw/CNn0VTXbEiIiIiPkdzVERERMRnKaiIiIiIz1JQEREREZ+loCIiIiI+S0FFREREfJaCioiIiPgsBRURERHxWQoqIiIi4rMUVESkWXr27Mlzzz3X7OOXLVuGyWSiqKiozWryJaf65yMizePn7QJEpG2cd955jBgxotV+ea5bt46QkJBmHz9x4kSysrKIiIhole8vImcmBRWRM5hhGNjtdvz8Tv6/gq5du57S1w4ICHBvEy8i0lIa+hHphG655RaWL1/O3//+d0wmEyaTifT0dPdwzFdffcWYMWOwWq2sWLGC/fv3M3PmTOLi4ggNDWXs2LEsWbLE42seO7RhMpn45z//yZVXXklwcDB9+/ZlwYIF7tePHfp56623iIyM5KuvvmLgwIGEhoZy8cUXk5WV5X5PbW0t9957L5GRkURHR/PII48wa9YsrrjiihOe76pVq5g8eTJBQUEkJydz7733Ul5e7lH7H/7wB2688UZCQ0NJTEzk+eef9/gaGRkZzJw5k9DQUMLDw7n22mvJycnxOGbBggWMGTOGwMBAYmJiuOqqqzxer6io4Kc//SlhYWF0796dV1999YR1i8jJKaiIdEJ///vfmTBhArfffjtZWVlkZWWRnJzsfv3hhx9m7ty57Nq1i2HDhlFWVsYll1zCkiVL2LRpE9OmTWPGjBlkZGSc8Ps88cQTXHvttWzdupVLLrmEm266iaNHjx73+IqKCv7617/yr3/9i++++46MjAwefPBB9+t//vOfee+993jzzTf5/vvvKSkpYf78+SesYdu2bUybNo2rrrqKrVu38sEHH7By5Uruvvtuj+Oefvpphg0bxsaNG3n00Uf55S9/yeLFiwFnZ+mKK67g6NGjLF++nMWLF7N//36uu+469/sXLlzIVVddxaWXXsqmTZv45ptvGDNmjMf3+Nvf/saYMWPYtGkTd911F7/4xS/YvXv3CesXkZNotX2YRcSnnHvuucZ9993n8Zxr6/r58+ef9P2DBg0ynn/+effjHj16GM8++6z7MWD89re/dT8uKyszTCaTsWjRIo/vVVhYaBiGYbz55psGYOzbt8/9nhdffNGIi4tzP46LizOefvpp9+Pa2lqje/fuxsyZM49b509+8hPjjjvu8HhuxYoVhtlsNiorK921X3zxxR7HXHfddcb06dMNwzCMr7/+2rBYLB5b0+/YscMAjLVr1xqGYRgTJkwwbrrppuPW0aNHD+PHP/6x+7HD4TBiY2ONefPmHfc9InJy6qiInIGO7QSUl5fz8MMPM2jQICIjIwkNDWX37t0n7agMGzbM/XlISAhhYWHk5uYe9/jg4GB69+7tfpyQkOA+vri4mJycHMaNG+d+3WKxMHr06BPWsGHDBt566y1CQ0PdH9OmTcPhcJCWluY+bsKECR7vmzBhArt27QJg165dJCcne3SdXH8WrmM2b97MBRdccMJaGv55mEwm4uPjT/jnISInp8m0ImegY+/eeeihh/jqq6/461//Sp8+fQgKCuKaa66hurr6hF/H39/f47HJZMLhcJzS8YZhNHquoWNfP5bD4eDnP/859957b6PXunfvfsL3ur6XYRiNvu+xzwcFBZ3wa8Gp/3mIyMmpoyLSSQUEBGC325t17IoVK7jlllu48sorGTp0KPHx8aSnp7dtgceIiIggLi6OtWvXup+z2+1s2rTphO8bNWoUO3bsoE+fPo0+AgIC3MetXr3a432rV69mwIABgLN7kpGRQWZmpvv1nTt3UlxczMCBAwFnt+Sbb7457fMUkVOjjopIJ9WzZ0/WrFlDeno6oaGhREVFHffYPn368MknnzBjxgxMJhO/+93vvNIJuOeee5g7dy59+vRhwIABPP/88xQWFjbZ7XB55JFHOOuss5g9eza33347ISEh7Nq1i8WLF3vc2fP999/zl7/8hSuuuILFixfz4YcfsnDhQgAuvPBChg0bxk033cRzzz1HbW0td911F+eee657mOyxxx7jggsuoHfv3lx//fXU1tayaNEiHn744bb9QxE5w6mjItJJPfjgg1gsFgYNGkTXrl1PON/k2WefpUuXLkycOJEZM2Ywbdo0Ro0a1Y7VOj3yyCPccMMN3HzzzUyYMME93yQwMPC47xk2bBjLly8nNTWVc845h5EjR/K73/2OhIQEj+MeeOABNmzYwMiRI/nDH/7A3/72N6ZNmwY4h2jmz59Ply5dmDx5MhdeeCG9evXigw8+cL//vPPO48MPP2TBggWMGDGCKVOmsGbNmrb5gxARN5NxsgFgEREvcTgcDBw4kGuvvZY//OEPLf46PXv25P777+f+++9vveJEpF1o6EdEfMbBgwf5+uuvOffcc7HZbLzwwgukpaVx4403ers0EfESDf2IiM8wm8289dZbjB07lrPPPptt27axZMkS94RWETnzaOhHREREfJY6KiIiIuKzFFRERETEZymoiIiIiM9SUBERERGfpaAiIiIiPktBRURERHyWgoqIiIj4LAUVERER8Vn/D+Ce0Ir3H6YUAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\"\"\"\n",
    "部分代码参考了GitHub项目d2l-ai/d2l-zh的思路\n",
    "（Copyright (c) 2022 Aston Zhang, Zachary C. Lipton,\n",
    "Mu Li, and Alexander J. Smola, Apache-2.0 License（见附录））\n",
    "\"\"\"\n",
    "# 多层循环神经网络\n",
    "class DeepRNN(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size, num_layers, dropout=0.):\n",
    "        super(DeepRNN, self).__init__()\n",
    "        self.input_size = input_size\n",
    "        self.hidden_size = hidden_size\n",
    "        self.num_layers = num_layers\n",
    "        self._flat_weight_names = []\n",
    "        self._all_weights = []\n",
    "        self.drop = nn.Dropout(p=dropout)\n",
    "        # 定义每一层循环神经网络的参数，由于参数数量不固定，\n",
    "        # 因此使用统一的命名方法更方便调用和管理\n",
    "        for layer in range(num_layers):\n",
    "            W_xh = nn.Parameter(normal((input_size, hidden_size)))\n",
    "            W_hh = nn.Parameter(normal((hidden_size, hidden_size)))\n",
    "            b_h = nn.Parameter(torch.zeros(hidden_size))\n",
    "            layer_params = (W_xh, W_hh, b_h)\n",
    "            params_names = [f'W_xh_l{layer}', f'W_hh_l{layer}', \\\n",
    "                f'b_h_l{layer}']\n",
    "            \n",
    "            # 将新的参数加入到成员列表中\n",
    "            for name, param in zip(params_names, layer_params):\n",
    "                setattr(self, name, param)\n",
    "            self._flat_weight_names.extend(params_names)\n",
    "            self._all_weights.append(params_names)\n",
    "            input_size = hidden_size\n",
    "        self._flat_weights = [getattr(self, wn) if hasattr(self, wn) \\\n",
    "            else None for wn in self._flat_weight_names]\n",
    "    \n",
    "    def __setattr__(self, attr, value):\n",
    "        if hasattr(self, '_flat_weight_names') and \\\n",
    "            attr in self._flat_weight_names:\n",
    "            idx = self._flat_weight_names.index(attr)\n",
    "            self._flat_weights[idx] = value\n",
    "        super().__setattr__(attr, value)\n",
    "    \n",
    "    def init_rnn_state(self, batch_size, hidden_size):\n",
    "        return (torch.zeros((self.num_layers, batch_size, hidden_size), \n",
    "            dtype=torch.float),)\n",
    "    \n",
    "    def forward(self, inputs, states):\n",
    "        seq_len, batch_size, _ = inputs.shape\n",
    "        layer_hidden_states, = states\n",
    "        layer_h_t = []\n",
    "        input_states = inputs\n",
    "        # 需要保存每一层的输出作为下一层的输入\n",
    "        for layer in range(self.num_layers):\n",
    "            hiddens = []\n",
    "            hidden_state = layer_hidden_states[layer]\n",
    "            for step in range(seq_len):\n",
    "                xh = torch.mm(input_states[step], \n",
    "                    getattr(self, f'W_xh_l{layer}'))\n",
    "                hh = torch.mm(hidden_state, getattr(self, f'W_hh_l{layer}'))\n",
    "                hidden_state = xh + hh + getattr(self, f'b_h_l{layer}')\n",
    "                hidden_state = self.drop(torch.tanh(hidden_state))\n",
    "                hiddens.append(hidden_state)\n",
    "            input_states = torch.stack(hiddens, dim=0)\n",
    "            layer_h_t.append(hidden_state)\n",
    "        return input_states, torch.stack(layer_h_t, dim=0)\n",
    "\n",
    "data_loader = DataLoader(torch.tensor(sent_tokens, dtype=torch.long), \n",
    "    batch_size=16, shuffle=True)\n",
    "deep_rnn = DeepRNN(128, 128, 2)\n",
    "train_rnn_lm(data_loader, deep_rnn, vocab_size, hidden_size=128, \n",
    "    epochs=200, learning_rate=1e-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f813cc29",
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "部分代码参考了GitHub项目d2l-ai/d2l-zh的思路\n",
    "（Copyright (c) 2022 Aston Zhang, Zachary C. Lipton,\n",
    "Mu Li, and Alexander J. Smola, Apache-2.0 License（见附录））\n",
    "\"\"\"\n",
    "# 双向循环神经网络\n",
    "class BiRNN(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size):\n",
    "        super(BiRNN, self).__init__()\n",
    "        self.input_size = input_size\n",
    "        self.hidden_size = hidden_size\n",
    "        # 正向循环神经网络参数\n",
    "        self.W_xh = nn.Parameter(normal((input_size, hidden_size)))\n",
    "        self.W_hh = nn.Parameter(normal((hidden_size, hidden_size)))\n",
    "        self.b_h = nn.Parameter(torch.zeros(hidden_size))\n",
    "        # 反向循环神经网络参数\n",
    "        self.W_xh_reverse = nn.Parameter(normal((input_size, hidden_size)))\n",
    "        self.W_hh_reverse = nn.Parameter(normal((hidden_size, hidden_size)))\n",
    "        self.b_h_reverse = nn.Parameter(torch.zeros(hidden_size))\n",
    "        \n",
    "    # 分别为正向和反向循环神经网络准备初始状态\n",
    "    def init_rnn_state(self, batch_size, hidden_size):\n",
    "        return (torch.zeros((batch_size, hidden_size), dtype=torch.float),\n",
    "               torch.zeros((batch_size, hidden_size), dtype=torch.float))\n",
    "    \n",
    "    def forward(self, inputs, states):\n",
    "        seq_len, batch_size, _ = inputs.shape\n",
    "        hidden_state, reverse_hidden_state = states\n",
    "        hiddens = []\n",
    "        for step in range(seq_len):\n",
    "            xh = torch.mm(inputs[step], self.W_xh)\n",
    "            hh = torch.mm(hidden_state, self.W_hh)\n",
    "            hidden_state = xh + hh + self.b_h\n",
    "            hidden_state = torch.tanh(hidden_state)\n",
    "            hiddens.append(hidden_state)\n",
    "        reverse_hiddens = []\n",
    "        for step in range(seq_len-1, -1, -1):\n",
    "            xh = torch.mm(inputs[step], self.W_xh_reverse)\n",
    "            hh = torch.mm(reverse_hidden_state, self.W_hh_reverse)\n",
    "            reverse_hidden_state = xh + hh + self.b_h_reverse\n",
    "            reverse_hidden_state = torch.tanh(reverse_hidden_state)\n",
    "            reverse_hiddens.insert(0, reverse_hidden_state)\n",
    "        # 将正向和反向循环神经网络输出的隐状态拼接在一起\n",
    "        combined_hiddens = []\n",
    "        for h1, h2 in zip(hiddens, reverse_hiddens):\n",
    "            combined_hiddens.append(torch.cat([h1, h2], dim=-1))\n",
    "        return torch.stack(combined_hiddens, dim=0), ()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b1650f51",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "epoch-199, loss=1.0983: 100%|█| 200/200 [05:10<00:00,  1.55s\n"
     ]
    },
    {
     "data": {
      "image/png": "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liEvL0/toZ22rVu3YtWqVdi5cyc2btwIm82GJUuWoKGhwe26Cy64AMXFxcrXN998o9KI+2bChAlu48/IyFDue+qpp/Dss8/ipZdewp49exAZGYnzzz9fOSdqMNizZ4/b69u4cSMA4Morr1SuGWzvYUNDA1JTU/HSSy91en9v3rd7770XX3zxBT766CP8+OOPqK+vx/Lly2G32wfqZXSpu9fX2NiItLQ0PProo0hLS8Pnn3+O48eP45JLLulw7W233eb2vr722msDMfxe6ek9BHr+dzlY30MAbq+ruLgYb731FgRBwC9+8Qu367z5PezNZ4RX/C6K5Oass84S77jjDrfbxo4dK/7ud79TaUSeU1ZWJgIQt27dqty2cuVKccWKFeoN6gz96U9/ElNTUzu9z+FwiJGRkeKTTz6p3Nbc3CyazWbxn//85wCN0PPuueceMTk5WXQ4HKIoDv73EID4xRdfKN/35n2rqakRfXx8xI8++ki5prCwUNRoNOL69esHbOy90f71dWb37t0iADE3N1e5beHCheI999zTv4PzkM5eY0//Lofae7hixQrxnHPOcbttML2HotjxM8JbfhdZUXHR0tKCffv2YcmSJW63L1myBDt27FBpVJ5jsVgAACEhIW63b9myBeHh4Rg9ejRuu+02lJWVqTG8Pjtx4gSio6ORlJSEa665BqdOnQIAZGdno6SkxO39NBgMWLhw4aB9P1taWvD+++/j5ptvdjuIc7C/h656877t27cPra2tbtdER0dj4sSJg/K9tVgsEAQBQUFBbrd/8MEHCAsLw4QJE/Dggw8Oqkog0P2/y6H0HpaWlmLdunW45ZZbOtw3mN7D9p8R3vK7OKgPJfS0iooK2O12REREuN0eERGBkpISlUblGaIo4v7778f8+fMxceJE5fZly5bhyiuvREJCArKzs/Hoo4/inHPOwb59+wbFLouzZs3Ce++9h9GjR6O0tBR//vOfMXfuXGRmZirvWWfvZ25urhrDPWNr165FTU0NbrrpJuW2wf4etteb962kpAR6vR7BwcEdrhlsv6vNzc343e9+h+uuu87tsLfrr78eSUlJiIyMxKFDh/DII4/gwIEDytSft+vp3+VQeg/fffddBAYG4vLLL3e7fTC9h519RnjL7yKDSidc/58qIL2B7W8bbO666y4cPHgQP/74o9vtV199tfLn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rl+7dm2Pjx8/frz44osvKt8nJCSIzz33nPI9APEPf/iD8n19fb0oCIL47bffuv2s6upqURRF8e233xYBiFlZWcpjXn75ZTEiIkL5PiIiQnz66aeV7202mxgfHy+uWLGiy3HeeOON4u233+522/bt20WNRiM2NTUpY7/gggvcrrn66qvFZcuWiaIoit99952o1WrdjqbPzMwUAYi7d+8WRVEU58yZI15//fVdjiMhIUG84YYblO8dDocYHh4uvvrqq10+hoh6xooK0TDUvhLQ0NCAhx56COPHj0dQUBACAgJw9OjRHisqkydPVv7s7++PwMBAlJWVdXm9n58fkpOTle+joqKU6y0WC0pLS3HWWWcp92u1WkyfPr3bMezbtw/vvPMOAgIClK+lS5fC4XAgOztbuW7OnDluj5szZw6OHDkCADhy5Aji4uLcqk7y34V8zf79+3Huued2OxbXvw9BEBAZGdnt3wcR9YzNtETDUPvVO7/97W+xYcMGPPPMM0hJSYGvry+uuOIKtLS0dPs8Pj4+bt8LggCHw3Fa14ui2OE2V+3vb8/hcODXv/41Vq9e3eG++Pj4bh8r/yxRFDv83Pa3+/r6dvtcwOn/fRBRz1hRIRqi9Ho97HZ7r67dvn07brrpJlx22WWYNGkSIiMjkZOT078DbMdsNiMiIgK7d+9WbrPb7UhPT+/2cdOmTUNmZiZSUlI6fOn1euW6nTt3uj1u586dGDt2LACpepKXl4f8/Hzl/sOHD8NisWDcuHEApGrJ999/f8avk4hODysqRENUYmIidu3ahZycHAQEBCAkJKTLa1NSUvD555/j4osvhiAIePTRR1WpBNx9991Ys2YNUlJSMHbsWLz44ouorq7utNohe/jhhzF79mysWrUKt912G/z9/XHkyBFs3LjRbWXPTz/9hKeeegqXXnopNm7ciE8++QTr1q0DAJx33nmYPHkyrr/+ejz//POw2Wy48847sXDhQmWa7E9/+hPOPfdcJCcn45prroHNZsO3336Lhx56qH//UoiGOVZUiIaoBx98EFqtFuPHj8eIESO67Td57rnnEBwcjLlz5+Liiy/G0qVLMW3atAEcreThhx/Gtddei1/+8peYM2eO0m9iNBq7fMzkyZOxdetWnDhxAgsWLMDUqVPx6KOPIioqyu26Bx54APv27cPUqVPxxBNP4O9//zuWLl0KQJqiWbt2LYKDg3H22WfjvPPOw8iRI/Hxxx8rj1+0aBE++eQTfPXVV5gyZQrOOecc7Nq1q3/+IohIIYg9TQATEanE4XBg3LhxuOqqq/DEE0/0+XkSExNx77334t577/Xc4IhoQHDqh4i8Rm5uLr777jssXLgQVqsVL730ErKzs3HdddepPTQiUgmnfojIa2g0GrzzzjuYOXMm5s2bh4yMDGzatElpaCWi4YdTP0REROS1WFEhIiIir8WgQkRERF6LQYWIiIi8FoMKEREReS0GFSIiIvJaDCpERETktRhUiIiIyGsxqBAREZHX+v/MVJX+zq6I+gAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\"\"\"\n",
    "部分代码参考了GitHub项目d2l-ai/d2l-zh的思路\n",
    "（Copyright (c) 2022 Aston Zhang, Zachary C. Lipton,\n",
    "Mu Li, and Alexander J. Smola, Apache-2.0 License（见附录））\n",
    "\"\"\"\n",
    "class AttentionRNN(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size):\n",
    "        super(AttentionRNN, self).__init__()\n",
    "        self.input_size = input_size\n",
    "        self.hidden_size = hidden_size\n",
    "        # 循环神经网络参数\n",
    "        self.W_xh = nn.Parameter(normal((input_size, hidden_size)))\n",
    "        self.W_hh = nn.Parameter(normal((hidden_size, hidden_size)))\n",
    "        self.b_h = nn.Parameter(torch.zeros(hidden_size))\n",
    "    \n",
    "    def init_rnn_state(self, batch_size, hidden_size):\n",
    "        return (torch.zeros((batch_size, hidden_size),\\\n",
    "            dtype=torch.float),)\n",
    "    \n",
    "    # 缩放点乘注意力\n",
    "    def attention(self, query, keys, values):\n",
    "        \"\"\"\n",
    "        query: batch_size * hidden_size\n",
    "        keys/values: batch_size * prev_len * hidden_size\n",
    "        \"\"\"\n",
    "        # batch_size * 1 * hidden_size\n",
    "        query = torch.unsqueeze(query, 1)\n",
    "        # batch_size * hidden_size * prev_len\n",
    "        keys = torch.permute(keys, (0, 2, 1))\n",
    "        # batch_size * 1 * prev_len\n",
    "        attention_scores = torch.bmm(query, keys) / np.sqrt(\\\n",
    "            self.hidden_size)\n",
    "        # batch_size * 1 * prev_len\n",
    "        attention_weights = F.softmax(attention_scores, dim=1)\n",
    "        # batch_size * hidden_size\n",
    "        attention_state = torch.squeeze(torch.bmm(attention_weights,\\\n",
    "            values))\n",
    "        return attention_state\n",
    "\n",
    "    def forward(self, inputs, states):\n",
    "        seq_len, batch_size, _ = inputs.shape\n",
    "        hidden_state, = states\n",
    "        hiddens = []\n",
    "        attention_hiddens = []\n",
    "        for step in range(seq_len):\n",
    "            xh = torch.mm(inputs[step], self.W_xh)\n",
    "            hh = torch.mm(hidden_state, self.W_hh)\n",
    "            hidden_state = xh + hh + self.b_h\n",
    "            hidden_state = torch.tanh(hidden_state)\n",
    "            \n",
    "            if step > 0:\n",
    "                # batch_size * hidden_size\n",
    "                query = hidden_state\n",
    "                # batch_size * prev_len * hidden_size\n",
    "                keys = values = torch.permute(torch.stack(hiddens,\\\n",
    "                    dim=0), (1, 0, 2))\n",
    "                \n",
    "                attention_state = self.attention(query, keys, values)                \n",
    "                attention_hiddens.append(attention_state)\n",
    "            else:\n",
    "                # 第0步，历史隐状态为空，无法进行注意力运算，\n",
    "                # 直接用隐状态填充\n",
    "                attention_hiddens.append(hidden_state)\n",
    "                \n",
    "            hiddens.append(hidden_state)\n",
    "        return torch.stack(attention_hiddens, dim=0), \\\n",
    "            (attention_state,)\n",
    "    \n",
    "data_loader = DataLoader(torch.tensor(sent_tokens, dtype=torch.long), \n",
    "    batch_size=16, shuffle=True)\n",
    "\n",
    "attention_rnn = AttentionRNN(128, 128)\n",
    "train_rnn_lm(data_loader, attention_rnn, vocab_size, hidden_size=128, \n",
    "    epochs=200, learning_rate=1e-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "0d4fa4ef",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "epoch-199, loss=0.9766: 100%|█| 200/200 [14:24<00:00,  4.32s\n"
     ]
    },
    {
     "data": {
      "image/png": "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smXLvG5ftmwZduzY4aNRDZyGhgYAQGRkpNftmzdvRmxsLDIzM3H33XejsrLSF8PrtzNnziAxMRGjR4/GrbfeitzcXABAXl4eysvLvT5PnU6HhQsXDtvP02az4e9//zt++MMfeh3EOdw/Q0+9+dz2798Pu93udU1iYiImTpw4LD/bhoYGCIKA8PBwr9vff/99REdHY8KECXj00UeHVSUQ6P7fZSB9hhUVFfjss8/wox/9qMN9w+kzbP87wl9+Fof1oYQDrbq6Gk6nE3FxcV63x8XFoby83EejGhiiKGL16tWYP38+Jk6cqNx++eWX46abbkJqairy8vLw5JNPYvHixdi/f/+w2GXxggsuwHvvvYfMzExUVFTg//7v/zB37lwcO3ZM+cw6+zwLCgp8Mdzztm7dOtTX1+Ouu+5Sbhvun2F7vfncysvLodVqERER0eGa4faz2traip///Of43ve+53XY24oVKzB69GjEx8fj6NGjeOKJJ3D48GFl6s/f9fTvMpA+w3fffRcmkwnXX3+91+3D6TPs7HeEv/wsMqh0wvO/VAHpA2x/23Bz//3348iRI9i+fbvX7bfccovy54kTJ2LmzJlITU3FZ5991uGHzh9dfvnlyp8nTZqEOXPmID09He+++67SuBdIn+dbb72Fyy+/HImJicptw/0z7Ep/Prfh9tna7XbceuutcLlc+POf/+x139133638eeLEiRg7dixmzpyJAwcOYPr06UM91D7r77/L4fYZAsBf//pXrFixAnq93uv24fQZdvU7AvD9zyKnfjxER0dDrVZ3SIGVlZUdEuVw8sADD2D9+vXYtGkTkpKSur02ISEBqampOHPmzBCNbmAZDAZMmjQJZ86cUVb/BMrnWVBQgI0bN+LHP/5xt9cN98+wN59bfHw8bDYb6urqurzG39ntdtx8883Iy8vDhg0bvKopnZk+fTqCgoKG7efa/t9lIHyGALBt2zacOnWqx59LwH8/w65+R/jLzyKDigetVosZM2Z0KMtt2LABc+fO9dGo+k8URdx///345JNP8O2332L06NE9PqampgZFRUVISEgYghEOPKvVihMnTiAhIUEpuXp+njabDVu2bBmWn+fbb7+N2NhYXHnlld1eN9w/w958bjNmzEBQUJDXNWVlZTh69Oiw+GzlkHLmzBls3LgRUVFRPT7m2LFjsNvtw/Zzbf/vcrh/hrK33noLM2bMwJQpU3q81t8+w55+R/jNz+KAtOQGkLVr14pBQUHiW2+9JR4/flx86KGHRIPBIObn5/t6aH123333iWFhYeLmzZvFsrIy5au5uVkURVG0WCziI488Iu7YsUPMy8sTN23aJM6ZM0ccNWqUaDabfTz63nnkkUfEzZs3i7m5ueKuXbvEq666SjSZTMrn9dxzz4lhYWHiJ598Iubk5Ii33XabmJCQMGzen8zpdIopKSni448/7nX7cP0MLRaLePDgQfHgwYMiAPF3v/udePDgQWXVS28+t3vvvVdMSkoSN27cKB44cEBcvHixOGXKFNHhcPjqbSm6e392u1285pprxKSkJPHQoUNeP5tWq1UURVE8e/as+PTTT4t79+4V8/LyxM8++0zMysoSp02b5hfvTxS7f4+9/Xc5XD9DWUNDgxgSEiK++uqrHR4/HD7Dnn5HiKJ//CwyqHTilVdeEVNTU0WtVitOnz7daznvcAKg06+3335bFEVRbG5uFpctWybGxMSIQUFBYkpKinjnnXeKhYWFvh14H9xyyy1iQkKCGBQUJCYmJorXX3+9eOzYMeV+l8slPvXUU2J8fLyo0+nEBQsWiDk5OT4ccf989dVXIgDx1KlTXrcP189w06ZNnf7bvPPOO0VR7N3n1tLSIt5///1iZGSkGBwcLF511VV+8767e395eXld/mxu2rRJFEVRLCwsFBcsWCBGRkaKWq1WTE9PF1etWiXW1NT49o156O499vbf5XD9DGWvvfaaGBwcLNbX13d4/HD4DHv6HSGK/vGzKLgHS0REROR32KNCREREfotBhYiIiPwWgwoRERH5LQYVIiIi8lsMKkREROS3GFSIiIjIbzGoEBERkd9iUCEiIiK/xaBCRL2SlpaGP/zhD72+fvPmzRAEAfX19YM2Jn/S178fIuodja8HQESDY9GiRZg6deqA/fLcu3cvDAZDr6+fO3cuysrKEBYWNiCvT0QjE4MK0QgmiiKcTic0mp7/ryAmJqZPz63VapVj4omI+otTP0QB6K677sKWLVvw0ksvQRAECIKA/Px8ZTrmq6++wsyZM6HT6bBt2zacO3cOy5cvR1xcHIxGI2bNmoWNGzd6PWf7qQ1BEPDmm2/iuuuuQ0hICMaOHYv169cr97ef+nnnnXcQHh6Or776CuPHj4fRaMRll12GsrIy5TEOhwOrVq1CeHg4oqKi8Pjjj+POO+/Etdde2+373bFjBxYsWIDg4GAkJydj1apVaGpq8hr7M888g+9973swGo1ITEzEn/70J6/nKCwsxPLly2E0GhEaGoqbb74ZFRUVXtesX78eM2fOhF6vR3R0NK6//nqv+5ubm/HDH/4QJpMJKSkpeP3117sdNxH1jEGFKAC99NJLmDNnDu6++26UlZWhrKwMycnJyv2PPfYY1qxZgxMnTmDy5MlobGzEFVdcgY0bN+LgwYO49NJLcfXVV6OwsLDb13n66adx880348iRI7jiiiuwYsUK1NbWdnl9c3Mzfvvb3+Jvf/sbtm7disLCQjz66KPK/b/5zW/w/vvv4+2338Z3330Hs9mMdevWdTuGnJwcXHrppbj++utx5MgRfPjhh9i+fTvuv/9+r+teeOEFTJ48GQcOHMATTzyBhx9+GBs2bAAgVZauvfZa1NbWYsuWLdiwYQPOnTuHW265RXn8Z599huuvvx5XXnklDh48iG+++QYzZ870eo0XX3wRM2fOxMGDB/HTn/4U9913H06ePNnt+ImoBwN2DjMR+ZWFCxeKDz74oNdt8tH169at6/Hx2dnZ4p/+9Cfl+9TUVPH3v/+98j0A8Ze//KXyfWNjoygIgvjFF194vVZdXZ0oiqL49ttviwDEs2fPKo955ZVXxLi4OOX7uLg48YUXXlC+dzgcYkpKirh8+fIux/n9739fvOeee7xu27Ztm6hSqcSWlhZl7JdddpnXNbfccot4+eWXi6Ioil9//bWoVqu9jqY/duyYCEDcs2ePKIqiOGfOHHHFihVdjiM1NVW8/fbble9dLpcYGxsrvvrqq10+hoh6xooK0QjUvhLQ1NSExx57DNnZ2QgPD4fRaMTJkyd7rKhMnjxZ+bPBYIDJZEJlZWWX14eEhCA9PV35PiEhQbm+oaEBFRUVmD17tnK/Wq3GjBkzuh3D/v378c4778BoNCpfl156KVwuF/Ly8pTr5syZ4/W4OXPm4MSJEwCAEydOIDk52avqJP9dyNccOnQIS5Ys6XYsnn8fgiAgPj6+278PIuoZm2mJRqD2q3d+9rOf4auvvsJvf/tbZGRkIDg4GDfeeCNsNlu3zxMUFOT1vSAIcLlcfbpeFMUOt3lqf397LpcLP/nJT7Bq1aoO96WkpHT7WPm1RFHs8Lrtbw8ODu72uYC+/30QUc9YUSEKUFqtFk6ns1fXbtu2DXfddReuu+46TJo0CfHx8cjPzx/cAbYTFhaGuLg47NmzR7nN6XTi4MGD3T5u+vTpOHbsGDIyMjp8abVa5bpdu3Z5PW7Xrl3IysoCIFVPCgsLUVRUpNx//PhxNDQ0YPz48QCkask333xz3u+TiPqGFRWiAJWWlobdu3cjPz8fRqMRkZGRXV6bkZGBTz75BFdffTUEQcCTTz7pk0rAAw88gDVr1iAjIwNZWVn405/+hLq6uk6rHbLHH38cF154IVauXIm7774bBoMBJ06cwIYNG7xW9nz33Xd4/vnnce2112LDhg346KOP8NlnnwEALrnkEkyePBkrVqzAH/7wBzgcDvz0pz/FwoULlWmyp556CkuWLEF6ejpuvfVWOBwOfPHFF3jssccG9y+FaIRjRYUoQD366KNQq9XIzs5GTExMt/0mv//97xEREYG5c+fi6quvxqWXXorp06cP4Wgljz/+OG677TbccccdmDNnjtJvotfru3zM5MmTsWXLFpw5cwYXXXQRpk2bhieffBIJCQle1z3yyCPYv38/pk2bhmeeeQYvvvgiLr30UgDSFM26desQERGBBQsW4JJLLsGYMWPw4YcfKo9ftGgRPvroI6xfvx5Tp07F4sWLsXv37sH5iyAihSD2NAFMROQjLpcL48ePx80334xnnnmm38+TlpaGhx56CA899NDADY6IhgSnfojIbxQUFODrr7/GwoULYbVa8fLLLyMvLw/f+973fD00IvIRTv0Qkd9QqVR45513MGvWLMybNw85OTnYuHGj0tBKRCMPp36IiIjIb7GiQkRERH6LQYWIiIj8FoMKERER+S0GFSIiIvJbDCpERETktxhUiIiIyG8xqBAREZHfYlAhIiIiv/X/Afqw4Z/KyKl0AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\"\"\"\n",
    "部分代码参考了GitHub项目d2l-ai/d2l-zh的思路\n",
    "（Copyright (c) 2022 Aston Zhang, Zachary C. Lipton,\n",
    "Mu Li, and Alexander J. Smola, Apache-2.0 License（见附录））\n",
    "\"\"\"\n",
    "# 多头注意力循环神经网络\n",
    "class MultiHeadAttentionRNN(AttentionRNN):\n",
    "    def __init__(self, input_size, hidden_size, num_heads=4):\n",
    "        super().__init__(input_size, hidden_size)\n",
    "        # 简单起见，一般要求hidden_size能够被num_heads整除\n",
    "        assert hidden_size % num_heads == 0\n",
    "        self.num_heads = num_heads\n",
    "        # 多头注意力参数，用于将查询、键、值映射到子空间\n",
    "        self.W_aq = nn.Parameter(normal((hidden_size, hidden_size)))\n",
    "        self.b_aq = nn.Parameter(torch.zeros(hidden_size))\n",
    "        self.W_ak = nn.Parameter(normal((hidden_size, hidden_size)))\n",
    "        self.b_ak = nn.Parameter(torch.zeros(hidden_size))\n",
    "        self.W_av = nn.Parameter(normal((hidden_size, hidden_size)))\n",
    "        self.b_av = nn.Parameter(torch.zeros(hidden_size))\n",
    "        self.W_ac = nn.Parameter(normal((hidden_size, hidden_size)))\n",
    "        self.b_ac = nn.Parameter(torch.zeros(hidden_size))\n",
    "\n",
    "    # 多头缩放点乘注意力\n",
    "    def attention(self, query, keys, values):\n",
    "        \"\"\"\n",
    "        query: batch_size * hidden_size\n",
    "        keys/values: batch_size * prev_len * hidden_size\n",
    "        \"\"\"\n",
    "        query = torch.mm(query, self.W_aq) + self.b_aq\n",
    "        ori_shape = keys.size()\n",
    "        \n",
    "        keys = torch.reshape(torch.mm(torch.flatten(keys, \n",
    "                start_dim=0, end_dim=1), self.W_ak) + \n",
    "                self.b_ak, ori_shape)\n",
    "        values = torch.reshape(torch.mm(torch.flatten(values, \n",
    "                start_dim=0, end_dim=1), self.W_av) + \n",
    "                self.b_av, ori_shape)\n",
    "        # batch_size * 1 * hidden_size\n",
    "        query = torch.unsqueeze(query, 1)\n",
    "        # batch_size * hidden_size * prev_len\n",
    "        keys = torch.permute(keys, (0, 2, 1))\n",
    "        \n",
    "        head_size = self.hidden_size // self.num_heads\n",
    "        query = torch.split(query, head_size, 2)\n",
    "        keys = torch.split(keys, head_size, 1)\n",
    "        values = torch.split(values, head_size, 2)\n",
    "        \n",
    "        heads = []\n",
    "        for i in range(self.num_heads):\n",
    "            # batch_size * 1 * prev_len\n",
    "            head_scores = torch.bmm(query[i], keys[i]) / np.sqrt(\n",
    "                self.hidden_size // self.num_heads) \n",
    "            # batch_size * 1 * prev_len\n",
    "            head_weights = F.softmax(head_scores, dim=1)\n",
    "            # batch_size * head_size\n",
    "            head_state = torch.squeeze(torch.bmm(head_weights, \n",
    "                values[i])) \n",
    "            heads.append(head_state)\n",
    "        heads = torch.cat(heads, dim=1)        \n",
    "        attention_state = torch.mm(heads, self.W_ac) + self.b_ac\n",
    "\n",
    "        return attention_state\n",
    "\n",
    "data_loader = DataLoader(torch.tensor(sent_tokens, \n",
    "    dtype=torch.long), batch_size=16, shuffle=True)\n",
    "\n",
    "mha_rnn = MultiHeadAttentionRNN(128, 128)\n",
    "train_rnn_lm(data_loader, mha_rnn, vocab_size, hidden_size=128, \n",
    "    epochs=200, learning_rate=1e-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "670ce598",
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "代码修改自GitHub项目huggingface/transformers\n",
    "（Copyright (c) 2020, The HuggingFace Team, Apache-2.0 License（见附录））\n",
    "\"\"\"\n",
    "# 实现Transformer模型\n",
    "class EmbeddingLayer(nn.Module):\n",
    "    def __init__(self, vocab_size, max_len, embed_size):\n",
    "        super().__init__()\n",
    "        self.vocab_size = vocab_size\n",
    "        self.max_len = max_len\n",
    "        self.embed_size = embed_size\n",
    "        self.word_embedding = nn.Embedding(vocab_size, embed_size)\n",
    "        self.pos_embedding = nn.Embedding(max_len, embed_size)\n",
    "        \n",
    "    def forward(self, input_ids, pos_ids):\n",
    "        \"\"\"\n",
    "        input_ids/pos_ids: batch_size * seq_len\n",
    "        return: batch_size * seq_len * embed_size\n",
    "        \"\"\"\n",
    "        word_embed = self.word_embedding(input_ids)\n",
    "        pos_embed = self.pos_embedding(pos_ids)\n",
    "        # 将词嵌入和位置嵌入相加得到嵌入层输出\n",
    "        return word_embed + pos_embed\n",
    "\n",
    "# 缩放点乘注意力\n",
    "class ScaledDotProductAttention(nn.Module):\n",
    "    def __init__(self, dropout):\n",
    "        super().__init__()\n",
    "        self.dropout = nn.Dropout(dropout)\n",
    "    \n",
    "    def forward(self, queries, keys, values, attention_mask):\n",
    "        \"\"\"\n",
    "        queries/keys/values: batch_size * seq_len * hidden_size\n",
    "        attention_mask: batch_size * seq_len * seq_len\n",
    "        return: batch_size * seq_len * hidden_size\n",
    "        \"\"\"\n",
    "        d = queries.size(-1)\n",
    "        # 根据点乘注意力的矩阵形式计算注意力分数，除以查询向量或键向量\n",
    "        # 维度的平方根，即为缩放点乘注意力\n",
    "        scores = torch.bmm(queries, torch.transpose(keys, 1, 2)) / np.sqrt(d)\n",
    "        # 将掩码为0的位置的注意力分数设为一个大负数，根据softmax函数\n",
    "        # 的性质，这些注意力分数归一化后接近0\n",
    "        scores[attention_mask == 0] = -1e6\n",
    "        self.attention_weights = F.softmax(scores, dim=-1)\n",
    "        return torch.bmm(self.dropout(self.attention_weights), values)\n",
    "    \n",
    "class MultiHeadSelfAttention(nn.Module):\n",
    "    def __init__(self, hidden_size, num_heads, dropout):\n",
    "        super().__init__()\n",
    "        assert hidden_size % num_heads == 0\n",
    "        self.hidden_size = hidden_size\n",
    "        self.num_heads = num_heads\n",
    "        self.W_q = nn.Linear(hidden_size, hidden_size)\n",
    "        self.W_k = nn.Linear(hidden_size, hidden_size)\n",
    "        self.W_v = nn.Linear(hidden_size, hidden_size)\n",
    "        self.W_o = nn.Linear(hidden_size, hidden_size)\n",
    "        self.attention = ScaledDotProductAttention(dropout)\n",
    "    \n",
    "    def transpose_qkv(self, states):\n",
    "        # 将长度为hidden_size的向量分成num_heads个长度相等的向量\n",
    "        states = states.reshape(states.shape[0], states.shape[1],\\\n",
    "            self.num_heads, self.hidden_size // self.num_heads)\n",
    "        states = torch.permute(states, (0, 2, 1, 3))\n",
    "        return states.reshape(-1, states.shape[2], states.shape[3])\n",
    "    \n",
    "    # 与transpose_qkv的变换相反\n",
    "    def transpose_output(self, states):\n",
    "        states = states.reshape(-1, self.num_heads, states.shape[1],\\\n",
    "            states.shape[2])\n",
    "        states = torch.permute(states, (0, 2, 1, 3))\n",
    "        return states.reshape(states.shape[0], states.shape[1], -1)\n",
    "    \n",
    "    def forward(self, queries, keys, values, attention_mask):\n",
    "        \"\"\"\n",
    "        querys/keys/values: batch * seq_len * hidden_size\n",
    "        attention_mask: batch * seq_len * seq_len\n",
    "        return:\n",
    "        \"\"\"\n",
    "        # (batch_size * num_heads) * seq_len * (hidden_size / num_heads)\n",
    "        queries = self.transpose_qkv(self.W_q(queries))\n",
    "        keys = self.transpose_qkv(self.W_k(keys))\n",
    "        values = self.transpose_qkv(self.W_v(values))\n",
    "        # 重复张量的元素，用以支持多个注意力头的运算\n",
    "        # (batch_size * num_heads) * seq_len * seq_len\n",
    "        attention_mask = torch.repeat_interleave(attention_mask,\\\n",
    "            repeats=self.num_heads, dim=0)\n",
    "        # (batch_size * num_heads) * seq_len * (hidden_size / num_heads)\n",
    "        output = self.attention(queries, keys, values, attention_mask)\n",
    "        # batch * seq_len * hidden_size\n",
    "        output_concat = self.transpose_output(output)\n",
    "        return self.W_o(output_concat)\n",
    "\n",
    "# 两层前馈神经网络\n",
    "class PositionWiseFNN(nn.Module):\n",
    "    def __init__(self, hidden_size, intermediate_size):\n",
    "        super().__init__()\n",
    "        self.dense1 = nn.Linear(hidden_size, intermediate_size)\n",
    "        self.relu = nn.ReLU()\n",
    "        self.dense2 = nn.Linear(intermediate_size, hidden_size)\n",
    "        \n",
    "    def forward(self, X):\n",
    "        return self.dense2(self.relu(self.dense1(X)))\n",
    "\n",
    "# 层归一化\n",
    "class LayerNorm(nn.Module):\n",
    "    def __init__(self, normalized_shape, eps=1e-6):\n",
    "        super().__init__()\n",
    "        self.gamma = nn.Parameter(torch.ones(normalized_shape))\n",
    "        self.beta = nn.Parameter(torch.zeros(normalized_shape))\n",
    "        # 一个小量用于数值稳定（防止除0）\n",
    "        self.eps = eps\n",
    "        \n",
    "    def forward(self, hidden_states):\n",
    "        mean = torch.mean(hidden_states, -1, keepdim=True)\n",
    "        std = torch.std(hidden_states, -1, keepdim=True)\n",
    "        return self.gamma * (hidden_states - mean) / (std +\\\n",
    "            self.eps) + self.beta\n",
    "\n",
    "# 将两个输入相加并归一化\n",
    "class AddNorm(nn.Module):\n",
    "    def __init__(self, hidden_size, dropout):\n",
    "        super().__init__()\n",
    "        self.dropout = nn.Dropout(dropout)\n",
    "        self.layer_norm = LayerNorm(hidden_size)\n",
    "        \n",
    "    def forward(self, X, Y):\n",
    "        return self.layer_norm(self.dropout(Y) + X)\n",
    "    \n",
    "# 一个完整的Transformer层\n",
    "class TransformerLayer(nn.Module):\n",
    "    def __init__(self, hidden_size, num_heads, dropout, intermediate_size):\n",
    "        super().__init__()\n",
    "        self.self_attention = MultiHeadSelfAttention(hidden_size,\\\n",
    "            num_heads, dropout)\n",
    "        self.add_norm1 = AddNorm(hidden_size, dropout)\n",
    "        self.fnn = PositionWiseFNN(hidden_size, intermediate_size)\n",
    "        self.add_norm2 = AddNorm(hidden_size, dropout)\n",
    "    \n",
    "    def forward(self, X, attention_mask):\n",
    "        Y = self.add_norm1(X, self.self_attention(X, X, X, attention_mask))\n",
    "        return self.add_norm2(Y, self.fnn(Y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "c1990dfb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 在Transformer模型基础上加上语言模型需要的输入输出、损失计算等\n",
    "class TransformerLM(nn.Module):\n",
    "    def __init__(self, vocab_size, max_len, hidden_size, num_layers,\\\n",
    "                 num_heads, dropout, intermediate_size):\n",
    "        super().__init__()\n",
    "        self.embedding_layer = EmbeddingLayer(vocab_size, max_len,\\\n",
    "            hidden_size)\n",
    "        self.num_layers = num_layers\n",
    "        # 使用ModuleList保存多个Transformer层，注意不能使用Python列表，\n",
    "        # Python列表保存的PyTorch变量无法自动求导\n",
    "        self.layers = nn.ModuleList([TransformerLayer(hidden_size,\\\n",
    "            num_heads, dropout, intermediate_size)\\\n",
    "            for _ in range(num_layers)])\n",
    "        self.output_layer = nn.Linear(hidden_size, vocab_size)\n",
    "        \n",
    "    def forward(self, input_ids):\n",
    "        # 这里实现的forward()函数一次只能处理一句话，\n",
    "        # 如果想要支持批次运算，实现起来会更复杂，也会引入冗余操作\n",
    "        seq_len = input_ids.size(0)\n",
    "        assert input_ids.ndim == 1 and seq_len <= \\\n",
    "            self.embedding_layer.max_len\n",
    "        \n",
    "        # 1 * seq_len\n",
    "        input_ids = torch.unsqueeze(input_ids, dim=0)\n",
    "        pos_ids = torch.unsqueeze(torch.arange(seq_len), dim=0)\n",
    "        # 定义下三角掩码，用于语言模型训练\n",
    "        # 1 * seq_len * seq_len\n",
    "        attention_mask = torch.unsqueeze(torch.tril(torch.ones((seq_len,\\\n",
    "            seq_len), dtype=torch.int32)), dim=0)\n",
    "        # 1 * seq_len * hidden_size\n",
    "        hidden_states = self.embedding_layer(input_ids, pos_ids)\n",
    "        for layer in self.layers:\n",
    "            hidden_states = layer(hidden_states, attention_mask)\n",
    "        outputs = self.output_layer(hidden_states)\n",
    "        \n",
    "        loss_fct = nn.CrossEntropyLoss(ignore_index=0)\n",
    "        loss = loss_fct(outputs[:, :-1].squeeze(),\\\n",
    "            input_ids[:, 1:].squeeze())\n",
    "        return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "6ccc6b17",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "epoch-49, loss=0.6772: 100%|█| 50/50 [05:35<00:00,  6.72s/it\n"
     ]
    },
    {
     "data": {
      "image/png": "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haibCg8Px759+5CXlwdXV1d4e3u3emxUVBRWr16N2bNnQxAEvPDCC5KMBDzyyCNISEhAVFQUoqOjsXz5cpSXl191tKPZ008/jVGjRmHBggW477774OLigszMTCQmJraY2bN792689dZbmDt3LhITE/HTTz9h/fr1AIApU6YgNjYWt99+Oz744ANoNBo8/PDDGD9+vOEy2YsvvojJkycjMjISt9xyCzQaDTZs2ICnnnrKsieFyM5xRIWom3riiScgl8sRExMDPz+/NvtN3n//fXh5eWH06NGYPXs2pk+fjqFDh1qxWr2nn34at956K+666y7Ex8cb+k0cHR1bfU1sbCySkpJw8uRJjB07FkOGDMELL7yAoKCgFsc9/vjjOHjwIIYMGYJXXnkF7777LqZPnw5Af4lm7dq18PLywrhx4zBlyhT06tULq1atMrx+woQJ+Omnn7Bu3ToMHjwYkyZNwr59+yxzIojIQBDbuwBMRCQRnU6Hfv364aabbsIrr7xi8vuEh4dj8eLFWLx4sfmKIyKr4KUfIrIZ+fn52Lx5M8aPH4+GhgasWLECubm5uO2226QujYgkwks/RGQzZDIZvvzySwwfPhzXXHMN0tLSsGXLFkNDKxHZH176ISIiIpvFERUiIiKyWQwqREREZLMYVIiIiMhmMagQERGRzWJQISIiIpvFoEJEREQ2i0GFiIiIbBaDChEREdms/wfL6mnAEIujTwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练TransformerLM，由于不再采取批次训练，因此不再使用RNNLM和data_loader\n",
    "def train_transformer_lm(data, model, epochs=50, learning_rate=1e-3):\n",
    "    optimizer = Adam(model.parameters(), lr=learning_rate)\n",
    "    model.zero_grad()\n",
    "    model.train()\n",
    "    \n",
    "    epoch_loss = []\n",
    "    with trange(epochs, desc='epoch', ncols=60) as pbar:\n",
    "        for epoch in pbar:\n",
    "            step_loss = []\n",
    "            np.random.shuffle(data)\n",
    "            for step, x in enumerate(data):\n",
    "                loss = model(torch.tensor(x, dtype=torch.long))\n",
    "                pbar.set_description(f'epoch-{epoch},'+\\\n",
    "                    f' loss={loss.item():.4f}')\n",
    "                loss.backward()\n",
    "                grad_clipping(model)\n",
    "                optimizer.step()\n",
    "                model.zero_grad()\n",
    "                step_loss.append(loss.item())\n",
    "            # 本章前面的模型训练使用batch_size为16，\n",
    "            # TransformerLM出于简便实现只能使用batch_size为1\n",
    "            # 因此TransformerLM每一步的损失方差会更大，\n",
    "            # 为便于对比，取每个epoch最后16个样本的平均损失\n",
    "            epoch_loss.append(np.mean(step_loss[-16:]))\n",
    "    \n",
    "    epoch_loss = np.array(epoch_loss)\n",
    "    plt.plot(range(len(epoch_loss)), epoch_loss)\n",
    "    plt.xlabel('training epoch')\n",
    "    plt.ylabel('loss')\n",
    "    plt.show()\n",
    "    \n",
    "sent_tokens = dataset.convert_tokens_to_ids()\n",
    "max_len=40\n",
    "for i, tokens in enumerate(sent_tokens):\n",
    "    tokens = tokens[:max_len]\n",
    "    tokens += [0] * (max_len - len(tokens))\n",
    "    sent_tokens[i] = tokens\n",
    "sent_tokens = np.array(sent_tokens)\n",
    "\n",
    "model = TransformerLM(vocab_size, max_len=40, hidden_size=128,\\\n",
    "    num_layers=1, num_heads=4, dropout=0., intermediate_size=512)\n",
    "train_transformer_lm(sent_tokens, model)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
